速读原著-Android应用开发入门教程(弹出对话框)

2020-01-15 10:36:00 浏览数 (1)

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 类型:

代码语言:javascript复制
 @Override 
 protected Dialog onCreateDialog(int id) { 
 }

onCreateDialog()函数的参数 id 是区分对话框的标示,当调用对话框的时候需要调用 showDialog()

代码语言:javascript复制
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()可以获得任意内容的界面。

0 人点赞