对话框顾名思义即人与应用系统对话交互的窗口:登录时检查用户信息可以用对话框提示,退出应用时也可以弹出退出确认。只要涉及到交互的地方都可以使用对话框。
一个对话框一般是出现在当前 Activity 之上的一个小窗口。下面的 Activity 失去焦点,对话框接受所有用户交互。对话框一般用于提示信息和与当前应用程序直接相关的小功能。Android API 支持下列类型:
-
警告对话框 AlertDialog:可以有 0 到 3 个按钮,一个单选框或复选框列表。能创建大多数交互界面,是推荐的类型。
-
进度对话框 ProgressDialog:显示进度环或进度条。它是 AlertDialog 的扩展,所以也支持按钮。
-
日期选择对话框 DatePickerDialog:让用户选择一个日期。
-
时间选择对话框 TimePickerDialog:让用户选择一个时间。
如果希望自定义对话框,可以扩展 Dialog 类。下面一起看常用对话框以及实现方式。
一、常用对话框结构图

1、常用确认对话框 2、日期对话框

3、单选对话框 4、多选对话框

5、自定义对话框

二、对话框实现方式
1. 首先实例化对话框,设置相关属性。如:
ProgressDialog mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("信息下载加载中....");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
2. 调用 show 方法显示。
mProgressDialog.show();
3. 调用 dismiss 方法隐藏。
mProgressDialog.dismiss();
三、AlertDialog 实例化与按钮
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("操作提示");
builder.setMessage("是否退出?");
//设置按钮事件
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogAcitivity.this, "取消",
Toast.LENGTH_SHORT).show();
}
});
//创建对话框
AlertDialog dialog = builder.create();
android 中 setPositiveButton、setNegativeButton 和 setNeutralButton 的区别是什么?
在对话框中出现的位置不同:setPositiveButton 出现在最右,一般把功能设为「确定」;setNegativeButton 出现在最左,一般设为「取消」,也就是调用 dismiss();setNeutralButton 如果设置则出现在中间。
系统对话框一般由三部分组成:标题区域、内容区域、按钮事件处理区域。
四、自定义对话框

1. 定义一个类继承 AlertDialog:
public class MyWeixinDialog extends AlertDialog {
private Activity mContext;
public MyWeixinDialog(Activity context) {
super(context);
mContext = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.exit_dialog);
Button confirm = (Button) findViewById(R.id.exitBtn0);
Button cancel = (Button) findViewById(R.id.exitBtn1);
confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mContext.finish();
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
}
对应布局 XML:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/exit_layout"
android:layout_width="280dp"
android:layout_height="wrap_content"
android:background="@drawable/confirm_dialog_bg2"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:padding="5dp"
android:text="退出微信"
android:textColor="#333"
android:textSize="20sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="退出后,你将收不到新的消\n息.确定要退出?"
android:textColor="#333"
android:textSize="16sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="33dp" >
<Button
android:id="@+id/exitBtn0"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:background="@drawable/btn_style_green"
android:gravity="center"
android:onClick="exitbutton0"
android:text="是"
android:textColor="#fff"
android:textSize="16sp" />
<Button
android:id="@+id/exitBtn1"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="@drawable/btn_style_white"
android:gravity="center"
android:onClick="exitbutton1"
android:text="否"
android:textColor="#333"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
2. 实例化
Dialog weixinDialog = new MyWeixinDialog(this);
3. 显示
weixinDialog.show();
五、对话框与 Activity 绑定
Activity 提供了方便管理创建、保存、恢复对话框的机制,例如 onCreateDialog(int)、onPrepareDialog(int, Dialog)、showDialog(int)、dismissDialog(int)。如果使用这些方法,Activity 将通过 getOwnerActivity() 返回该 Activity 管理的对话框。
-
onCreateDialog(int):Android 会把这个 Activity 设为每个对话框的所有者,自动管理状态并挂靠到 Activity。对话框打开时,菜单键显示该 Activity 的选项菜单,音量键修改 Activity 使用的音频流。
-
showDialog(int):想显示对话框时调用并传递唯一整数 ID。第一次被请求时,系统调用 onCreateDialog(int id),应在这里初始化 Dialog 并返回。
-
onPrepareDialog(int, Dialog):显示前还会调用这个可选回调。想在每次打开时改属性就定义它。它每次打开都调用,而 onCreateDialog 仅第一次打开时调用。不定义则对话框保持和上次打开时一样。
-
dismissDialog(int):关闭时可以对对话框调用 dismiss(),也可以从 Activity 调 dismissDialog(int id)。用 onCreateDialog 管理状态时,每次消除后对象状态由 Activity 保留;不再需要就调用 removeDialog(int id),删除内部引用,若正在显示也会被消除。
在 Activity 中调用 showDialog(1) 时系统会自动调用 onCreateDialog 创建 Dialog,只需在其中返回 Dialog:
showDialog(1);
@Override
protected Dialog onCreateDialog(int id) {
switch(id){
case 1:
return new DatePickerDialog();
}
}
六、更优实现:DialogFragment
/**
* 调用方法:
* MyAlertDialogFragment dialogFragment = new MyAlertDialogFragment();
* dialogFragment.show(getFragmentManager(), "dialog");
*
*/
public class MyAlertDialogFragment extends DialogFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//法二
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.article_view, container, false);
View tv = v.findViewById(R.id.article);
((TextView)tv).setText(mTitle);
return v;
}
// 法一
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("提示框")
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
Toast.makeText(getActivity(), "确定",
Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
Toast.makeText(getActivity(), "取消",
Toast.LENGTH_SHORT).show();
}
}).create();
}
}
调用:
MyAlertDialogFragment dialogFragment = new MyAlertDialogFragment();
dialogFragment.show(getFragmentManager(), "dialog");
| 类型 / 做法 |
要点 |
| AlertDialog |
0–3 个按钮,可带单选/多选列表,最常用 |
| ProgressDialog |
进度环或进度条,继承 AlertDialog |
| Date/TimePickerDialog |
选日期或时间 |
| 自定义 Dialog |
继承 AlertDialog,setContentView 自己的布局 |
| Activity 托管 |
showDialog / onCreateDialog / dismissDialog |
| DialogFragment |
推荐的现代写法,用 FragmentManager.show |
一句话总结:提示和确认用 AlertDialog,进度用 ProgressDialog;自定义就继承 Dialog/AlertDialog,长期维护更推荐 DialogFragment。