Dialog是Android中根据用户的意向弹出一些提示的信息,告诉用户是否要执行该操作的一种小的窗体,也就是弹出式菜单。
以下为Alert Dialog、Date Dialog、ArrayAdapter Dialog、自定义 Dialog、4种Dialog的实现方法。
1.Alert Dialog 提示对话框
样式展示:
//AlertDialog 生成方法一
//使用类 AlertDialog
public void alertDialog() {
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle("提示:");
alertDialog.setMessage("确定要退出程序吗?");
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "想一下",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialog.show();
}
//AlertDialog 生成方法二
//使用类 AlertDialog.Builder
private void alertDialog2() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle("提示:");
alertDialog.setMessage("确定要退出程序吗?");
alertDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog.setNegativeButton("取消", null);
alertDialog.show();
}
2.Date Dialog 日期选择对话框
样式展示:
代码实现:
public void dataDialog() {
new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
String date = String.format("%d-%d-%d", year, month+1, dayOfMonth);
Toast.makeText(MainActivity.this, date, Toast.LENGTH_SHORT).show();
}
}, Calendar.getInstance().get(Calendar.YEAR),//获取当前时间设置为默认选项
Calendar.getInstance().get(Calendar.MONTH),
Calendar.getInstance().get(Calendar.DAY_OF_MONTH)).show();
}
public void timeDialog() {
new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String date = String.format("%d:%d",hourOfDay, minute);
Toast.makeText(MainActivity.this, date, Toast.LENGTH_SHORT).show();
}
}, 0, 0, true).show();
}
3.ArrayAdapter Dialog 自定义列表对话框
利用 ArrayAdapter 可以更好的自定义Dialog内容里的选项。
样式展示:
实现方法也很简单,首先定义一个 Layout 页面,里边可以自定义图标,也可以在里面定义各种 button。
array_item_layout.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp"
android:gravity="center_vertical">
<ImageView
android:id="@+id/item_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/star"/>
<TextView
android:id="@+id/item_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试"
android:layout_marginLeft="15dp"/>
</LinearLayout>
代码实现:
public void arrayDialog() {
final String[] items = {"Java", "Mysql", "Android", "HTML", "C", "JavaScript"};
//数组适配器
//参数1:环境
//参数2:布局资源索引,指的是每一项数据所呈现的样式android.R.layout.xxx
//参数3:数据源
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.array_item_layout, R.id.item_txt, items);
AlertDialog.Builder builder = new AlertDialog.Builder(this)
//.setView(view)也可以使用setView来直接设置inflate加载的布局
.setTitle("请选择")
//参数1:适配器对象(对数据显示样式的规则制定器)
//参数2:监听器
.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this, items[i], Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
}
});
builder.show();
}
4.自定义 Dialog
样式展示:
首先还是先创建一个layout编排自定义样式。
xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:layout_height="300dp"
android:orientation="vertical"
android:gravity="center_horizontal"
android:background="@mipmap/dialog_bg">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定要退出吗?"
android:textSize="18sp"
android:textColor="#000000"
android:layout_marginTop="190dp"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="25dp">
<Button
android:id="@+id/no_btn"
android:layout_width="100dp"
android:layout_height="40dp"
android:background="@mipmap/no_btn" />
<Button
android:id="@+id/yes_btn"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_marginStart="20dp"
android:background="@mipmap/yes_btn" />
</LinearLayout>
</LinearLayout>
然后定义一个myDialog类继承Dialog类,重载构造函数。
public class MyDialog extends Dialog {
public MyDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
//设置布局
setContentView(R.layout.dialog_layout);
findViewById(R.id.yes_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.exit(0);
}
});
findViewById(R.id.no_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
}
在style.xml中定义一个风格,去掉dialog自带的标题以及让背景变半透明。
<style name="MyDialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
在MainActivity类中定义一个方法,用于编写显示dialog以及显示的位置。
public void diyDialog() {
//传入context和style的id
MyDialog myDialog = new MyDialog(this, R.style.MyDialog);
//自定义dialog的显示位置
Window window = myDialog.getWindow();
window.setGravity(Gravity.CENTER);
WindowManager.LayoutParams lp = myDialog.getWindow().getAttributes();
lp.y = -250;
window.setAttributes(lp);
myDialog.show();
}
自定义dialog的流程大概就是这样,最后在自己的逻辑代码上调用该方法显示自定义的dialog就可以了。