对话框
Android提供了丰富的电话框支持,它提供了如下4种常用的对话框。
- AlertDialog:功能最丰富、实际应用最广的对话框。
- ProgressDialog:进度对话框,这个对话框只是对简单进度条的封装。
- DatePickerDialog:日期选择对话框,这个对话框只是对DataPicker的包装。
- TimerPickerDialog:时间选择对话框,这个对话框只是对TimePicker的包装。
上面4种对话框中功能最强、用户最灵活的就是AlertDialog,因此应用也非常广泛,而其他三种对话框都是它的子类。
本节将会详细介绍各种对话框的功能和用法。
使用AlertDialog创建对话框
AlertDialog的功能很强大,它可以生成各种内容的对话框。但实际上AlertDialog生成的对话框总有如下结构。
AlertDialog生辰的对话框可分为如下4个区域。
- 图标区。
- 标题区。
- 内容区。
- 按钮区。
从上面对话框的结构来看,创建一个对话框需要如下几步。
- 使用创建AlertDialog.Builder对象。
- 调用AlertDialog.Builder的setTitile或setCustomTitle()方法设置标题。
- 调用AlertDialog.Builder的setIcon()方法设置图标。
- 调用AlertDialog.Builder的相关方法设置对话框内容。
- 调用AlertDialog.Builder的setPositiveButton()、setNegativeButton()或setNeutralButton()方法添加多个按钮。
- 调用AlertDialog.Builder的create()方法创建AlertDialog对象,再调用AlertDialog对象的show()方法将该对话框显示出来。
上面的6个步骤中,第4个步骤是最灵活的,AlertDialog允许创建各种内容的对话框。归纳起来,AlertDialog提供了如下6种方法来指定对话框的内容。
- setMessage():设置对话框内容为简单文本内容。
- setItems():设置对话框内容为简单列表项。
- setSingleChoiceItems():设置对话框内容为简单列表项。
- setMultiChoiceItems():设置对话框内容为多选列表项。
- setAdapter():设置对话框内容为自定义列表项。
- setView():设置对话框内容为自定义View。
下面通过几个实例来介绍AlertDialog的用法。
实例:显示提示消息对话框
本程序的界面非常简单,程序上面定义了一个文本框和6个按钮,每次用户单击一个按钮时,将会显示不同类型的对话框。
界面布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" > <!-- 显示一个普通的文本编辑框组件 --> <EditText android:id="@+id/show" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> <!-- 定义一个普通的按钮组件 --> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="简单按钮" android:onClick="simple"/> <!-- 定义一个普通的按钮组件 --> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="简单列表项按钮" android:onClick="simpleList"/> <!-- 单选列表项组件 --> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="单选列表项对话框" android:onClick="singleChoice" /> <!-- 多选列表项对话框 --> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="多选列表项对话框" android:onClick="multiChoice" /> <!-- 自定义列表项对话框 --> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="自定义列表项对话框" android:onClick="customList" /> <!-- 自定义View对话框 --> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="自定义View的对话框" android:onClick="customView" /> </LinearLayout>
后台文件如下:
public void simple(View source) { AlertDialog.Builder builder=new AlertDialog.Builder(this) //设置对话框标题 .setTitle("简单对话框") //设置图标 .setIcon(R.drawable.tools) .setMessage("对话框的测试内容\n第二行内容"); //为AlertDialog.Builder添加“确定按钮 setPositiveButton(builder); //为AlertDialog.Builder添加“取消”按钮 setNegativeButton(builder).create().show(); }
上面的程序中粗体字代码为该对话框设置了图标、标题等属性,上面的程序中还调用了setPositiveButton()和setNegativeButton()方法添加按钮。这两个方法的代码如下。
private AlertDialog.Builder setPositiveButton(AlertDialog.Builder builder) { //调用setPositiveButton方法添加“确定”按钮 return builder.setPositiveButton("确定", new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub show.setText("单击了【确定】按钮!"); } }); } private AlertDialog.Builder setNegativeButton(AlertDialog.Builder builder) { //调用setNegativeButton方法添加“取消”按钮 return builder.setNegativeButton("取消",new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub show.setText("单击了【取消】按钮"); } }); }
除此之外,AlertDialog.Builder还提供了如下方法来添加按钮。
setNeutralButton(CharSequence text,DialogInterface.OnClickListener listener):添加一个装饰性按钮。
运行上面的程序,单击程序中“简单对话框”按钮,将看到如图所示效果。
实例:简单列表项对话框
AlertDialog.Builder调用setItems()方法即可设置简单列表项的对话框,调用该方法时需要传入一个数组或数组资源的资源ID。
下面的代码调用setItems()来设置简单列表项对话框,程序代码如下。
String[] items=new String[]{"疯狂Java讲义", "疯狂Ajax讲义", "轻量级JavaEE企业应用实战", "疯狂Android讲义"}; public void simpleList(View source) { AlertDialog.Builder builder=new AlertDialog.Builder(this) //设置对话框标题 .setTitle("简单列表对话框") //设置图标 .setIcon(R.drawable.tools) //设置简单的列表项内容 .setItems(items, new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub show.setText("你选中了《"+items[which]+"》"); } }); //为AlertDialog.Builder添加“确定”按钮 setPositiveButton(builder); //为AlertDialog.Builder添加“取消”按钮 setNegativeButton(builder).create().show(); }
上面的程序中粗体字代码调用AlertDialog.Builder的setItems()方法为对话框设置了多个列表项,此处生成了4个普通列表项。
运行上面的程序后单击“简单列表项对话框”按钮,程序将显示下图所示的界面。
实例:单选列表项对话框
只要调用AlertDialog.Builder的setSingleChoiceItems()方法即可创建带单选列表项的对话框。调用setSingleChoiceItems()方法时既可传入数组做为参数,也可传入Cursor(相当于数据库查询结果集)作为参数,也可传入ListAdapter作为参数。如果传入ListAdapter作为参数,则由ListAdapter来提供多个列表项组件。
后台代码文件如下:
public void singleChoice(View source) { AlertDialog.Builder builder=new AlertDialog.Builder(this) //设置对话框标题 .setTitle("单选列表项对话框") //设置图标 .setIcon(R.drawable.tools) //设置单选列表项,默认选中第二项(索引为1) .setSingleChoiceItems(items, 1,new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub show.setText("你选中了《"+items[which]+"》"); } }); //为AlertDialog.Builder添加“确定”按钮 setPositiveButton(builder); //为AlertDialog.Builder添加“取消”按钮 setNegativeButton(builder).create().show(); }
运行上面的程序,单击“单选列表项对话框”按钮,应用显示下图所示状况。
实例:多选列表项对话框
只要调用AlertDialog.Builder的setMultieChoiceItems()方法即可创建一个多选列表的对话框。调用setMultieChoiceItems()方法时即可传入数组作为参数,也可传入Cursor(相当于数据库查询结果集)作为参数。
下面的方法调用了setMultieChoiceItems()方法来创建带多选列表项的对话框。
后台代码文件如下:
//多选列表项对话框 public void multiChoice(View source) { AlertDialog.Builder builder=new AlertDialog.Builder(this) //设置对话框标题 .setTitle("多选列表项对话框") //设置图标 .setIcon(R.drawable.tools) //设置多选列表项,设置勾选第2项,第4项 .setMultiChoiceItems(items,new boolean[]{false,true,false,true},null); //为AlertDialog.Builder添加“确定”按钮 setPositiveButton(builder); //为AlertDialog.Builder添加“取消”按钮 setNegativeButton(builder).create().show(); }
调用AlertDialog.Builder的setMultiChoiceItems()方法添加多选列表时,需要传入一个boolean[]参数,该参数有两个作用:①设置初始化时选中那些列表项。②该boolean[]类型的参数还可用于动态的获取多选列表中列表项的选中状态。
运行上面的程序,然后单击“多选列表项对话框”按钮,程序将显示如图所示的界面。
实例:自定义列表项对话框
AlertDialog.Builder提供了一个setAdapter()方法来设置对话框的内容,该方法需要传入一个Adapter参数,这样即可由该Adapter负责提供多个列表项组件。
提示:不仅setAdapter()方法可以接受Adapter作为参数,setSingleChoice()方法也可以接受Adapter作为参数,这意味着调用setSingleChoice()方法也可实现自定义列表项对话框。
下面的方法调用了setAdapter()方法来创建自定义列表项的对话框。
//自定义列表项对话框 public void customList(View source) { AlertDialog.Builder builder=new AlertDialog.Builder(this) //设置对话框标题 .setTitle("自定义列表项对话框") //设置图标 .setIcon(R.drawable.tools) .setAdapter(new ArrayAdapter<String>(this,R.layout.array_item,items), null); //为AlertDialog.Builder添加“确定”按钮 setPositiveButton(builder); //为AlertDialog.Builder添加“取消按钮” setNegativeButton(builder).create().show(); }
上面的程序中粗体字代码调用setAdapter()方法时传入了一个ArrayAdapter,该ArrayAdapter将会负责提供多个自定义列表项。如果需要,完全可以用创建SimpleAdapter对象或扩展BaseAdapter的方法来实现Adapter,并作为参数传入setAdapter()方法。
其中上面代码中的R.layout.array_item的布局文件如下:
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24dp" android:padding="10px" android:shadowColor="#f0f" android:shadowDx="4" android:shadowDy="4" android:shadowRadius="2" > </TextView>
运行上面的程序,然后单击“自定义列表项对话框”按钮,程序将显示如图所示的界面。
实例:自定义View的对话框
AlertDialog.Builder的setView()方法可以接受一个View组件,该View组件将会作为对话框的内容,通过这种方式,开发者可以“随心所欲”地定制对话框的内容——因为在Android界面编程中,一切都是View。本实例将会定义一个登录对话框,为实现该登录对话框,先定义一个登录的界面布局,该界面布局文件如下。
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/loginForm" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TableRow > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="用户名:" android:textSize="10pt"/> <!-- 输入用户名的文本框 --> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请填写登录账号" android:selectAllOnFocus="true"/> </TableRow> <TableRow > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="密码:" android:textSize="10pt" /> <!-- 输入密码的文本框 --> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请填写密码"/> </TableRow> <TableRow > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="电话号码:" android:textSize="10pt"/> <!-- 输入电话号码的文本框 --> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请填写您的电话号码" android:selectAllOnFocus="true" android:phoneNumber="true"/> </TableRow> </TableLayout>
上面的界面布局中定义了登录用的三个输入框:输入用户名的文本框、输入密码的密码框、输入电话号码的输入框。接下来在应用程序中调用AletDialog.Builder的setView(View view)方法让对话框显示该输入界面即可。
该程序与前面介绍的列表对话框的内容比较相似,只是将原来的调用setItems()设置列表项,改为现在的调用setView()来设置自定义视图。下面给出该程序的关键代码。
//自定义View对话框
public void customView(View source)
{
//装载/res/layout/login.xml界面布局
TableLayout loginForm=(TableLayout)getLayoutInflater().inflate(R.layout.login, null);
new AlertDialog.Builder(this)
//设置对话框的图标
.setIcon(R.drawable.tools)
//设置对话框的标题
.setTitle("自定义View对话框")
//设置对话框显示的View对象
.setView(loginForm)
//为对话框设置一个“确定”按钮
.setPositiveButton("登录", new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
//为该对话框设置一个“取消”按钮
.setNegativeButton("取消", new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
//创建并显示对话框
.create()
.show();
}
上面的程序中第一行粗体字代码显示装载了/res/layout/login.xml文件,并返回该文件对应的TableLayout作为View,接下来程序调用了AlertDialog.Builder的setVIew()方法来显示上一行代码所获得的TableLayot。
运行上面的程序,然后单击“自定义View对话框”按钮,应用程序将显示如图所示的效果。