Android中常用的对话框有通知对话框、列表对话框、单选对话框、多选对话框以及进度对话框。其中,通知对话框、列表对话框、单选以及多选对话框由AlertDialog.Builder创建,进度对话框由ProgressDialog创建。
常用方法:
setIcon 设置对话框标题栏左侧的那个图标
setTitle 设置对话框标题栏的提示信息
setMessage 设置对话框主体部分的提示信息
setPositiveButton 设置确定按钮
setNegativeButton 设置取消按钮
setCancelable 设置对话框在点击返回键时是否会关闭
show 显示对话框
为了对比方便,下面将通过一个案例分别演示这五种对话框的用法。
创建一个新工程,工程名叫AlertDialog。该工程的主界面有五个按钮,这五个按钮绑定了分别调用其对应对话框的函数,点击不同的按钮在其对应的函数里展示不同的对话框。因此下面的操作默认都是在该工程中实现的。
该工程的布局文件代码清单如4-26:
代码清单4-26 layout_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="演示五种常见对话框" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通知对话框"
android:onClick="notifyDialog"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="列表对话框"
android:onClick="listDialog"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单选对话框"
android:onClick="singleDialog"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="多选对话框"
android:onClick="multiDialog"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="进度对话框"
android:onClick="progressDialog"/>
</LinearLayout>
下面我们将为这五个按钮分别设置点击事件,来演示各种对话框的使用方式:
1.通知对话框
通知对话框是弹出的小型窗口提示信息,一般会有一个提示信息和两个按钮“确定”,“取消”两个按钮。使用Builder创建一个对话框,调用里面的方法可以设置对话框的图标、标题、提示信息等。
代码清单如代码清单4-27:
代码清单4-27 MainActivity.java中的通知对话框代码
//通知对话框
public void notifyDialog(View view){
Builder builder = new Builder(this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("通知对话框");
builder.setMessage("您看到的是通知对话框");
//设置确定按钮的点击事件
builder.setPositiveButton("确定",new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"确定按钮被点击了!",0).show();
}
});
//设置取消按钮的点击事件
builder.setNegativeButton("取消",new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"取消按钮被点击了!",0).show();
}
});
//将对话框显示出来
builder.show();
}
代码解释:我们让通知对话框按钮响应了点击事件,setMessage()方法给对话框设置了信息,setPositiveButton()方法给对话框设置了“确定”按钮并在监听方法里响应对话框中“确定”按钮的点击事件;setNegativeButton()方法给对话框设置了“取消”按钮并在监听方法里响应对话框中“取消”按钮;后调用show()将对话框展示出来。
注:当通知对话框提示的信息是要求用户必须观看且必须做出确定或者取消的选择的时候,需要设置setCancelable属性为false(默认true),以防止用户直接使用返回键关闭对话框。
2.列表对话框
列表对话框基本样式和通知对话框一样,只是通知对话框只展示单一信息,而列表对话框则是展示列表信息,也就是说对话框中可以展示多条信息让用户现在,类似于ListView,列表对话框样式,它也是用Builder来创建,调用Builder对象的setItems()方法来设置要展示的列表项。
代码清单如4-28:
代码清单4-28 MainActivity.java中的列表对话框代码
// 列表对话框
public void listDialog(View view) {
Builder builder = new Builder(this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择要去的城市:");
final String[] cities = new String[] { "北京", "上海", "广州", "深圳" };
builder.setItems(cities, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String city = cities[which];
Toast.makeText(MainActivity.this, "您选择的城市是" + city, 0).show();
}
});
builder.show();
}
在代码清单4-28中用setItems()方法设置列表对话框的显示数据和点击事件。
3.单选对话框
单选对话框的样式和RadioGroup/RadioButton的样式类似,知识单选对话框是以对话框的形式展现出来的,单选框样式,使用Builder来创建,调用Builder对象的setSingleChoiceItems方法,给条目设置点击事件。
清单如代码清单4-29:
代码清单4-29 MainActivity.java中的单选对话框代码
//单选对话框
public void singleDialog(View view){
Builder builder = new Builder(this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择您要学习的 编程语言:");
final String[] languages = new String[]{"Java","C/C++","iOS",".Net"};
builder.setSingleChoiceItems(languages, 0, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String language = languages[which];
Toast.makeText(MainActivity.this, "您选择的课程是" + language, 0).show();
}
});
// 设置确定按钮的点击事件
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "确定按钮被点击了!", 0).show();
}
});
// 设置取消按钮的点击事件
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "取消按钮被点击了!", 0).show();
}
});
builder.show();
}
代码中Builder对象调用setSingleChoiceItems()方法给界面进行填充数据,并给条目设置点击事件。此方法中第一个参数是要展示的单选列表项,第二个参数是对应的选中的条目的下标索引,第三个是点击事件。
4.多选对话框
多选对话框能将多列选择的条目以对话框的形式展示出来,多选对话框也是使用Builder来创建,调用Builder对象的setMultiChoiceItems方法,设置要展示的列表项。
代码清单4-30所示:
代码清单4-30 MainActivity.java中的多选对话框代码
//多选对话框
public void multiDialog(View view){
Builder builder = new Builder(this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择您的兴趣爱好:");
final String[] hobbies = new String[]{"逛淘宝","看杂志","健身","旅游"};
builder.setMultiChoiceItems(hobbies, null , new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
String hobby = hobbies[which];
//判断是否选择了某一项
if (isChecked) {
Toast.makeText(MainActivity.this, "您选择了" + hobby, 0).show();
}else {
Toast.makeText(MainActivity.this, "您取消了" + hobby, 0).show();
}
}
} );
builder.setPositiveButton("确定",null);
builder.setNegativeButton("取消", null);
builder.show();
}
代码解释:此代码中用Builder对象的setMultiChoiceItems()方法给对话框设置数据并给对话框里的条目设置监听事件,此方法中的第一参数是要展示的多选列表项;第二个参数是对应每个列表项的选中状态,传null则默认状态都不选中;第三个参数是点击事件。
5.进度对话框
进度对话框是用来显示进度的对话框,它不同于之前几种对话框,它是由ProgressDialog对象来创建的,而且进度对话框内部使用了消息机制Handler来进行处理,所以它可以直接在子线程中进行修改,无需再单独设置Handler来修改UI。进度对话框样式所示:
代码清单4-31所示:
代码清单4-31 MainActivity.java中的进度对话框代码
//进度对话框
public void progressDialog(View view){
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setIcon(R.drawable.ic_launcher);
dialog.setTitle("进度对话框");
dialog.setMessage("玩命加载中...");
//设置对话框的样式为水平
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//给进度条设置大值
dialog.setMax(100);
//显示对话框
dialog.show();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
SystemClock.sleep(100);
dialog.incrementProgressBy(1);
if (dialog.getMax() == dialog.getProgress()) {
//将对话框设置为不可见
dialog.dismiss();
Toast.makeText(MainActivity.this, "下载完成!", 0).show();
}
}
}
}).start();
}
代码解释:此代码中创建了一个ProgressDialog对象,setProgressStyle()方法来设置对话框的样式;setMax()设置进度对话框进度的大值;dismiss()方法的作用是取消对话框的显示;代码中开启了一个子线程模拟进度的变化。