6.6 弹出对话框
在 GUI 程序中,有时需要弹出对话框来提示一些信息。这些对话框比一个独立的屏幕简单,在 Android 中弹出式对话框不同于表示一个屏幕的活动,它通常用于简单的功能处理。
对话框的父类是 android.app.Dialog,通过构建类 android.app.AlertDialog 来实现弹出式对话框,可以使用AlertDialog.Builder 和不同的参数来构建对话框。
参考示例程序:Dialog(ApiDemo => App=>Dialog)
源代码:com/example/android/apis/app/AlertDialogSamples.java
布局文件:alert_dialog.xml
Dialog 程序的运行结果如图所示:
通过点击屏幕上的不同按钮(第 4 个按钮除外)将会启动不同的对话框。
实现方法是继承 onCreateDialog()
函数,返回一个 Dialog 类型:
@Override
protected Dialog onCreateDialog(int id) {
}
onCreateDialog()
函数的参数 id 是区分对话框的标示,当调用对话框的时候需要调用 showDialog()
。
public final void showDialog (int id)
showDialog()
函数也是通过 id 来区分对话框。通过 showDialog()和 onCreateDialog()函数可以统一活动中的对话框。
6.6.1. 提示信息和两个按钮的对话框
第 1 个按钮(OK Cancel dialog with a message)启动一个提示信息和两个按钮的对话框,如图所示:
代码实现的片断如下所示:
代码语言:javascript复制return new AlertDialog.Builder(AlertDialogSamples.this)
.setIcon(R.drawable.alert_dialog_icon)
.setTitle(R.string.alert_dialog_two_buttons_title)
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 左键事件 */
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 右键事件 */
}
})
其中,setPositiveButton 表示设置的左面的按钮,setNegativeButton 表示设置的右面的按钮,这两个按钮是确定的,但是可以设置其显示的字符和点击后的行为函数。
6.6.2. 提示信息和三个按钮的对话框
第 2 个按钮(OK Cancel dialog with a long message)启动一个提示信息和三个按钮的对话框,如图所示:
代码实现的片断如下所示:
代码语言:javascript复制return new AlertDialog.Builder(AlertDialogSamples.this)
.setIcon(R.drawable.alert_dialog_icon)
.setTitle(R.string.alert_dialog_two_buttons_msg)
.setMessage(R.string.alert_dialog_two_buttons2_msg)
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 左键事件 */
}
})
.setNeutralButton(R.string.alert_dialog_something, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 中键事件 */
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 右键事件 */
}
})
本对话框包含了 3 个按钮,与上一个例子的主要区别在于这里使用了 setNeutralButton()表示的设置中间的按钮。
6.6.3. 列表项对话框
第 3 个按钮(List dialog)启动一个列表项对话框,如图所示;
代码实现的片断如下所示:
代码语言:javascript复制 return new AlertDialog.Builder(AlertDialogSamples.this)
.setTitle(R.string.select_dialog)
.setItems(R.array.select_dialog_items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String[] items =
getResources().getStringArray(R.array.select_dialog_items);
new AlertDialog.Builder(AlertDialogSamples.this)
.setMessage("You selected: " which " , " items[which])
.show();
}
})
这里使用了 setItems()表示设置几个不同的项目,从 res/values/array.xml 文件中取得 select_dialog_items 的内容,这部分内容如下所示:
代码语言:javascript复制<string-array name="select_dialog_items">
<item>Command one</item>
<item>Command two</item>
<item>Command three</item>
<item>Command four</item>
</string-array>
这里的 Item 也设置了点击函数,因此它们被点击后,也会弹出新的对话框。
6.6.4. 单选项和按钮对话框
第 5 个按钮(Single choice list)启动一个单选项和按钮对话框;
代码实现的片断如下所示:
代码语言:javascript复制return new AlertDialog.Builder(AlertDialogSamples.this)
.setIcon(R.drawable.alert_dialog_icon)
.setTitle(R.string.alert_dialog_single_choice)
.setSingleChoiceItems(R.array.select_dialog_items2, 0, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
})
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 左键事件 */
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 右键事件 */
}
})
本例是一个包含单选项的对话框,其中的选项使用了更简单的模式,从 res/values/array.xml 文件中取得select_dialog_items2
中的内容作为单选项的项目。
这部分的内容如下所示:
代码语言:javascript复制<string-array name="select_dialog_items2">
<item>Map</item>
<item>Satellite</item>
<item>Traffic</item>
<item>Street view</item>
</string-array>
6.6.5. 复选项和按钮对话框
第 6 个按钮(Repeat alarm)启动一个复选项和按钮对话框;
代码实现的片断如下所示:
代码语言:javascript复制 return new AlertDialog.Builder(AlertDialogSamples.this)
.setIcon(R.drawable.ic_popup_reminder)
.setTitle(R.string.alert_dialog_multi_choice)
.setMultiChoiceItems(R.array.select_dialog_items3,
new boolean[]{false, true, false, true, false, false, false},
new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int whichButton,
boolean isChecked) {
/* 点击复选框的响应 */
}
})
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 左键事件 */
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 右键事件 */
}
})
.create();
本例是一个包含复选项的对话框,从 res/values/array.xml 文件中取得 select_dialog_items3 中的内容作为单选项的项目:
代码语言:javascript复制<string-array name="select_dialog_items3">
<item>Every Monday</item>
<item>Every Tuesday</item>
<item>Every Wednesday</item>
<item>Every Thursday</item>
<item>Every Friday</item>
<item>Every Saturday</item>
<item>Every Sunday</item>
</string-array>
6.6.6. 文本的按键对话框(使用布局文件)
第 7 个按钮(Text Entry dialog)启动一个包含文本的按键对话框。
Dialog 程序中调用各个对话框的效果如图所示:
代码实现的片断如下所示:
代码语言:javascript复制LayoutInflater factory = LayoutInflater.from(this);
final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry,
null);
return new AlertDialog.Builder(AlertDialogSamples.this)
.setIcon(R.drawable.alert_dialog_icon)
.setTitle(R.string.alert_dialog_text_entry)
.setView(textEntryView)
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 左键事件 */
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 右键事件 */
}
})
.create();
}
alert_dialog_text_entry.xml
也是一个布局文件,其中包含了 2 个文本框和 2 个可编辑文本,这就是显示在屏幕上的内容,由此根据这种模式,也可以在弹出的对话框中使用布局文件。
由此,在这个对话框中,包含了这些相应的控件。
如上面对话框的效果所示,对话框可以设置标题、图标、提示信息、最多 3 个按钮、单选项、复选项,甚至可以设置一个 View。最后一个对话框是通过设置一个 View 来实现的,设置的内容在布局文件 alert_dialog_text_entry.xml
中。
对话框的类为 android.app.Dialog,通过 android.app.AlertDialog.Builder
类来建立,在建立的过程中可以进行多项设置。
- setIcon()和 setTitle():用于设置图标和标题;
- setMessage():用于设置提示信息;
- setPositiveButton()、setNeutralButton()和 setNegativeButton():用于设置左、中、右按钮;
- setSingleChoiceItems()和 setMultiChoiceItems():用于设置单选项和复选项;
- setView():用于设置一个 View 作为对话框的内容。
以上函数的返回类型均为 android.app.AlertDialog.Builder,也就是这个类本身,因此可以使用如下的方式进行连续调用来设置更多的内容。
设置完成后调用 create()函数返回 android.app.AlertDialog 类,这个类表示一个可以使用的对话框。在 Android 中使用对话框,可以在没有 Activity 的情况下建立一个比较简易的窗体,基本界面可以通过直接设置得到,通过 setView()可以获得任意内容的界面。