听完孔明介绍完Activity的使用,三人若有所悟地坐在茅房门外,刘备更是激动地流下了泪水。
关羽问道:“大哥为何如此激动?”
刘备掩面道:“二弟不知,我小时候蛮文不好……”
“不是吧?大哥现在蛮文也不见得多好吧?”,张飞插嘴道。
只见刘备随手拿起一张擦鼻涕纸就糊到张飞脸上!
“呜呜……大哥继续,大哥继续!”
刘备继续道:“话说我小时候蛮文不好,单词各种不会拼,那时碰到蛮文考试简直就是一场噩梦!”说到这里,刘备不禁浑身打起寒战来。
关羽拍拍刘备的肩膀:“看来大哥也有一段不堪回首的童年啊!”
刘备说:“可是刚才听孔明先生讲解开发时,才知道Eclipse竟然有自动补全功能,一个alt+/就解决了困扰我多年的技术难题!”
张飞说:“大哥,你好挫……”
只见刘备随手拿起一张擦屁股纸就糊到张飞脸上!
就在三人进行毫无意义的吐槽的时候,茅房内又传来孔明爽朗的呼噜声,整个房子都随之一震一震的。
“还说我们打呼噜厉害,他一个人的声跟我们加起来差不多嘛……”张飞把糊到脸上的擦屁股纸揭了下来。
关羽严肃地捋了捋胡须,说:“三弟,你小看我们自己了……”
张飞问道:“那我们现在如何是好?”
刘备说:“老办法,刷牙洗脸睡觉觉!”
之后,一个白天又过去了。
刘关张三人醒转过来,只听孔明说道:“醒了?”
刘备说:“必须的!”
孔明说:“那好,今天我们讲讲Dialog的使用。”
刘备诧异道:“先生今天为何如此爽快,直接就开讲,毫不拖泥带水,莫非有阴谋?”
孔明:“阴你个头的谋,主要是前边吐槽的篇幅太长了,再吐槽下去伤不起呀!”
刘关张三人同时一拍大腿,齐道:“有道理!”
1.1. 对话框Dialog简介
Dialog在很多的PC和移动终端操作系统中都有用到,每一个操作系统的Dialog的功能都是类似的,一般用于提示用户进行下一步或展示程序运行的状态等。在Android中,Dialog是一个出现在当前Activity上的一个小窗口,用于用户交互。AndroidAPI中支持的Dialog类型有以下几种:
l 警告对话框AlertDialog:是最常用的对话框,可以实现很多交互功能,例如,单选对话框和多选对话框。
l 进度对话框ProgressDialog:该对话框显示一个进度条或者进度滚动环。ProgressDialog是AlertDialog的子类,具有AlertDialog的属性。
l 时间类对话框:该对话框让用户选择指定的时间,包括日期选择对话框DatePickerDialog和时间选择对话框TimePickerDialog。
l 自定义对话框:通过继承已有的对话框、重写已有对话框的方法来实现个性化的对话框。
1.2. Dialog与Activity的关系
Dialog与Activity之间存在一定的关系,Activity提供了一些方法用于管理对话框,如下所示:
l onCreateDialog(int):在Activity中调用此方法可以初始化Dialog,Android系统会将此Activity设置为创建的Dialog所有者,从而让Activity自动管理该Dialog。
孔明:onCreateDialog(int)是回调函数,不是程序员自己调用的,我相信主公一定已经发现这一点了。此外,此方法只会在第一次创建Dialog的时候调用一次。
|
l showDialog(int):该方法接受一个标识对话框id的整数,并将对应id的Dialog显示出来。如果对应id的Dialog已经存在,就会调用onPrepareDialog(int,Dialog)方法更新Dialog的内容;如果不存在,就会调用onCreateDialog(int)方法创建对话框。
l onPrepareDialog(int,Dialog):该方法在对话框显示之前被调用。
l dismissDialog(int):该方法用于关闭参数指定id的对话框。实际上,该方法是通过调用Dialog的dismiss()方法来关闭对话框的,在调用dismissDialog(int)方法之后,对话框对象依然由Activity保留,可以通过调用removeDialog(int)方法彻底删除该对话框。
孔明:使用Activity对话框管理机制会更简单,这种方式只需要三步: 1. 定义对话框的id。 2. 重写onCreateDialog(int)方法来创建对话框。 3. 调用showDialog(int)方法显示对话框。 |
1.3. Dialog种类
Android提供的对话框主要包括:警告对话框、进度对话框、时间类对话框、自定义对话框。下面通过一个实例介绍如何实现这些对话框。首先新建一个Activity,命名为DialogActivity,然后定义这些对话框各自的id,代码如下所示:
对话框id代码清单7-3-0:
/**
* @author小飞飞:小明明从小就爱看书,屋里挂满了科学家的画像,马克思,恩格斯,祖冲之,
列宁,蜡笔小新,哈里波特……
*/
// 定义对话框的id
// 确定取消对话框
static final int CONFIRM_DIALOG = 1;
// 多个按钮信息框
static final int MULTI_BTN_DIALOG =2;
// 列表框
static final int LIST_DIALOG = 3;
// 进度条框
static final int PROGRESS_DIALOG = 4;
// 单项选择列表框
static final int SINGLE_OPTION_DIALOG= 5;
// 多项选择列表框
static final int MULTI_LIST_DIALOG =6;
// 自定义对话框
static final int CUSTOM_DIALOG = 7;
// 读取对话框
static final int LOADING_DIALOG = 8;
// 日期选择对话框
static final int DATE_PICKER_DIALOG =9;
// 时间选择对话框
static final int TIME_PICKER_DIALOG =10;
// 通过继承自定义的对话框
static final int CUSTOM_VIEW_DIALOG =11;
接着,通过重写Activity的onCreateDialog(int)方法来初始化上面代码中定义的各个对话框,具体代码如下所示:
onCreateDialog代码清单7-3-0:
// 初始化对话框时候调用的回调方法,一般在此初始化对话框
@Override
protected DialogonCreateDialog(int id) {
Log.v(TAG, "onCreateDialog");
Dialog dialog = null;
switch (id) {
case CONFIRM_DIALOG:
//初始化确定取消对话框代码
break;
case MULTI_BTN_DIALOG:
//初始化多个按钮对话框代码
break;
//省略其他case
}
return dialog;
}
运行程序,结果如图7-1所示:
图7-1对话框示例程序的主界面
当点击按钮时会获得相应的对话框id,根据id调用相应的showDialog(int)方法显示对话框。showDialog(int)方法会在Dialog第一次创建时调用onCreateDialog(int)方法,并在随后每次显示Dialog时调用onPrepareDialog(int,Dialog)方法更新Dialog的内容。下面的小节将详细介绍每个对话框的创建方法。
1.3.1.确定取消对话框
确定取消对话框,顾名思义,包含了一个确定按钮和一个取消按钮。这类对话框一般用于提示应用程序的各类信息,例如,创建账号成功、金币获得和程序退出等。确定取消对话框可以由警告对话框AlertDialog的Builder内部类来创建,代码如下所示:
AlertDialog代码清单7-3-1:
Dialog dialog = newAlertDialog.Builder(DialogActivity.this)
.setIcon(android.R.drawable.btn_star).setTitle("确定取消对话框")
.setMessage("你学会使用确定取消对话框了吧?")
.setNegativeButton("取消", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("你选择了取消");
}
}).setPositiveButton("确定", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("你选择了确定");
}
}).create();
dialog.show();
从代码可以看出Builder内部类的构造方法接受一个Activity的参数,并通过设置图标的setIcon()方法、设置文本信息的setMessage()方法、设置按钮的setNegativeButton()和setPositiveButton()方法来设置dialog的属性。setNegativeButton()和setPositiveButton()方法都接受两个参数,一是按钮上的文本,如“确定”和“取消”;二是按钮监听器,该监听器需要使用DialogInterface.OnClickListener()的接口,如上述代码,当点击按钮时,监听器调用showToast()方法,showToast()方法的定义如下:
private voidshowToast(String str) {
Toast.makeText(DialogActivity.this,str, Toast.LENGTH_LONG).show();
}
可以通过调用dialog.dismiss()方法使对话框消失。
孔明:主公,在调用dialog.dismiss()方法时最好验证一下dialog是否为null以免发生错误。
|
将上述代码加入到DialogActivity的onCreateDialog()方法当中,具体的代码如下所示:
确定取消对话框初始化代码清单7-3-1:
/**
* @author小飞飞:小明明真厉害,不愧为“代码皇后”!
*/
@Override
protected Dialog onCreateDialog(int id) {
Log.v(TAG, "onCreateDialog");
Dialog dialog = null;
switch (id) {
case CONFIRM_DIALOG:
// 通过AlertDialog的子类Builder来创建对话框
// 可以调用设置图标,设置标题等方法
// DialogInterface.OnClickListener是对话框的监听器
dialog = newAlertDialog.Builder(this).setIcon(android.R.drawable.btn_star)
.setTitle("确定取消对话框").setMessage("你学会使用确定取消对话框了吧?")
// 设置否定按钮
.setNegativeButton("取消", newDialogInterface.OnClickListener() {
@Override
public voidonClick(DialogInterface dialog, int which) {
showToast("你选择了取消");
}
})
// 设置确定按钮
.setPositiveButton("确定", newDialogInterface.OnClickListener() {
@Override
public voidonClick(DialogInterface dialog, int which) {
showToast("你选择了确定");
}
}).create();
break;
// case ......
// 其他case 暂时省略
}
return dialog;
}
运行程序,结果如图7-2所示:
图7-2确定取消对话框
当点击对话框的“确定”按钮时,对话框消失,并触发该按钮的监听事件,显示一个Toast。如图7-3所示:
图7-3 点击对话框的确定按钮时的界面
1.3.2.多个按钮信息框
多个按钮信息框可以使用AlertDialog来实现。下面通过在DialogActivity的onCreateDialog(int)方法中加入初始化多个按钮信息框的代码来实现包含三个按钮的对话框,具体代码如下:
多个按钮信息框初始化代码清单7-3-2:
case MULTI_BTN_DIALOG:
dialog = new AlertDialog.Builder(this).setIcon(android.R.drawable.btn_star)
.setTitle("多个按钮信息框").setMessage("你喜欢刀疤鸭吗?")
.setNegativeButton("喜欢", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("你选择了喜欢");
}
})
// 设置中间按钮
.setNeutralButton("一般般", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("你选择了一般般");
}
}).setPositiveButton("不喜欢", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("你选择了不喜欢");
}
}).create();
break;
上述代码为对话框定义了三个按钮,其文本分别是“喜欢”、“一般般”和“不喜欢”,当点击按钮时,会将该按钮的文本以Toast的形式显示出来。运行程序,结果如图7-4所示:
图7-4 多个按钮信息框
当点击“喜欢”按钮时,Toast显示“你选择了喜欢”,如图7-5所示:
图7-5 点击“喜欢”按钮后出现的界面
1.3.3.列表框
当需要用户选择的内容大于三个时,就需要使用列表框了,列表框将选项以列表的形式展示给用户。下面通过在DialogActivity的onCreateDialog(int)方法中加入一个case来实现列表框,具体代码如下所示:
列表框初始化代码清单7-3-3:
case LIST_DIALOG:
dialog = newAlertDialog.Builder(this).setIcon(android.R.drawable.btn_star)
// 设置标题以及用到的列表数组
.setTitle("列表选择框").setItems(mItems, newDialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
showToast("你选择的id为" + which + ", " + mItems[which]);
}
}).create();
break;
从上述代码可以看出,列表框也是使用AlertDialog来创建的,不同的是setItems()方法,该方法包含两个参数:一是一个CharSequence类型的数组,可以用字符串数组来代替;二是监听器,监听器onClick()方法的参数which用于表示当前的选项。将列表中要用到的数组定义如下:
// 定义要显示的字符串数组
final String[] mItems= {
"数据结构", "Java", "Android", "算法", "数据库","数据挖掘", "自然语言处理"
};
运行程序,结果如图7-6所示:
图7-6 列表框
当点击 “Android”选项之后,Toast显示“你选择的id为2,Android”,如图7-7所示:
图7-7 列表框监听器
1.3.4.进度条框
进度条框一般用于展示网络下载、数据存储的进度。进度条框需要使用ProgressDialog来实现,下面通过在DialogActivity的onCreateDialog(int)方法中加入一个case来实现进度条框,具体代码如下所示:
进度条框初始化代码清单7-3-4:
/**
* @author小飞飞:大哥从小也爱看书,屋里挂满了军事家的画像,马克思,恩格斯,祖冲之,
范冰冰,如花,凤姐……
*/
case PROGRESS_DIALOG:
mProgressDialog = newProgressDialog(this);
mProgressDialog.setTitle("进度条对话框");
mProgressDialog.setIcon(android.R.drawable.btn_star);
// 设置进度条框的风格
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置最大值
mProgressDialog.setMax(MAX_PROGRESS);
// 设置一个按钮
mProgressDialog.setButton("确定", newDialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
showToast("你选择了确定");
}
});
// 设置第二个按钮
mProgressDialog.setButton2("取消", newDialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
showToast("你选择了取消");
}
});
// 启动线程
new Thread(newRunnable() {
@Override
public void run() {
int Progress = 0;
while (Progress <MAX_PROGRESS) {
try {
Thread.sleep(100);
Progress++;
mProgressDialog.incrementProgressBy(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
dialog = mProgressDialog;
break;
上述代码通过new ProgressDialog(this)方法创建了一个进度条框,同时,通过setProgressStyle()方法将进度条设置为横向,通过setMax()方法设置进度条的最大值,其中MAX_PROGRESS定义如下:
// ProgressDialog的最大值
staticfinal int MAX_PROGRESS = 100;
setButton()和setButton2()方法分别为进度条框设置了一个确定按钮和一个取消按钮。上述代码定义了一个线程用于演示进度条逐渐增长的效果,该线程每隔100ms都会通过incrementProgressBy(1)方法使得进度条的数值增加1。运行程序,进度条会逐渐增长,如图7-8所示:
图7-8进度条框
1.3.5.单项选择列表框
单项选择列表框包含了一个列表、一对确定和取消的按钮。单项选择列表框可以使用AlertDialog来实现。下面通过在DialogActivity的onCreateDialog(int)方法中加入一个case来实现单项选择列表框,具体代码如下所示:
单项选择框初始化代码清单7-3-5:
case SINGLE_OPTION_DIALOG:
dialog = newAlertDialog.Builder(this).setIcon(android.R.drawable.btn_star)
.setTitle("单项选择列表框")
// 设置单项选择列表的内容
.setSingleChoiceItems(mItems, 0, newDialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
mSingleChoiceID = whichButton;
showToast("你选择的id为" + whichButton +" , " + mItems[whichButton]);
}
}).setNegativeButton("取消", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("你取消了选择");
}
}).setPositiveButton("确定", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("你选择的id为" +mSingleChoiceID + " , "
+ mItems[mSingleChoiceID]);
}
}).create();
break;
上述代码的setSingleChoiceItems()方法与之前的setItems()方法类似。该方法包含三个参数:一是一个CharSequence类型的数组,可以用字符串数组来代替;二是默认选择项的id;三是监听器。运行程序,结果如图7-9所示:
图7-9单项选择对话框
1.3.6.多项选择列表框
多项选择列表框可以提供给用户多种选择,下面通过在DialogActivity的onCreateDialog(int)方法中加入一个case来实现多项选择列表框,具体代码如下所示:
多项选择列表框初始化代码清单7-3-6:
/**
* @author小飞飞:小羽羽从小更爱看书,屋里挂满了哲学家的画像,马克思,恩格斯,祖冲之,
施瓦辛格,布鲁斯·威利斯,史泰龙……
*/
case MULTI_LIST_DIALOG:
dialog = newAlertDialog.Builder(this).setIcon(android.R.drawable.btn_star)
// 设置标题以及多想选择的条目id是否选中的数组
.setTitle("多项选择").setMultiChoiceItems(mItems,
newboolean[]{false, false, false, false, false, false, false},
newDialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int whichButton,
booleanisChecked) {
if (isChecked) {
MultiChoiceID.add(whichButton);
showToast("你选择的id为" + whichButton +" , " +
mItems[whichButton]);
} else {
MultiChoiceID.remove(MultiChoiceID.indexOf(whichButton));
}
}
}).setNegativeButton("取消", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("你取消了选择");
}
}).setPositiveButton("确定", newDialogInterface.OnClickListener() {
@Override
public voidonClick(DialogInterface dialog, intwhich) {
String str = "";
int size =MultiChoiceID.size();
for (int i = 0; i < size; i++) {
str +=mItems[MultiChoiceID.get(i)] + ", ";
}
showToast("你选择的是" + str);
}
}).create();
break;
上述代码中的setMultiChoiceItems()方法包含三个参数:一是一个CharSequence类型的数组;二是一个boolean类型的数组,表示每一项是否被选中,默认为false,表示未被选中;三是监听器,重写了onClick()方法,该方法将选中的项添加到一个List里。
运行程序,结果如图7-10所示:
图7-10多项选择对话框
当点击确定按钮时,就会通过一个Toast显示选中的选项,如图7-11所示:
图7-11点击确定按钮
1.3.7.读取对话框
读取对话框实际上是ProgressDialog的一个简单的应用,当进行下载或读取文件时展示给用户一个等待界面。下面通过在DialogActivity的onCreateDialog(int)方法中加入一个case来实现读取对话框,具体代码如下所示:
读取对话框初始化代码清单7-3-7:
case LOADING_DIALOG:
mProgressDialog = newProgressDialog(this);
// 设置标题,消息以及是否可取消
mProgressDialog.setTitle("读取ing");
mProgressDialog.setMessage("正在读取中请稍候");
mProgressDialog.setCancelable(true);
dialog = mProgressDialog;
break;
上述代码设置了读取对话框的标题、消息、是否可取消。运行程序,如图7-12所示:
图7-12读取对话框
下面介绍如何使用onPrepareDialog()方法更新对话框。重写DialogActivity的onPrepareDialog()方法,代码如下所示:
@Override
public voidonPrepareDialog(int id, Dialogdialog) {
switch(id) {
case LOADING_DIALOG:
mPrepareDialogCount++;
// 更新对话框的内容
dialog.setTitle("第" + mPrepareDialogCount + "次读取ing");
}
super.onPrepareDialog(id,dialog);
}
上述代码中,mPrepareDialogCount用于存储是第几次打开对话框的,当id为LOADING_DIALOG时,将读取对话框的题目设置为“第mPrepareDialogCount次读取ing”。
运行程序,结果如图7-13所示:
图7-13更新读取对话框
1.3.8.时间选择对话框
时间选择对话框TimePickerDialog是用于设置时间的,其构造方法如下所示:
TimePickerDialog(Contextcontext, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView)
该构造方法包含5个参数:一是Context,可以由创建对话框的Activity来传递;二是OnTimeSetListener,即时间设定的监听器,当时间设定成功后触发;三是整数hourOfDay,用于表示小时数;四是整数minute,用于表示分钟数;最后的is24HourView用于设置是否使用24小时计时。下面通过在DialogActivity的onCreateDialog(int)方法中加入一个case来实现时间选择对话框,具体代码如下所示:
时间选择对话框初始化代码清单7-3-8:
case TIME_PICKER_DIALOG:
Calendar c1 = Calendar.getInstance();
inthourOfDay = c1.get(Calendar.HOUR_OF_DAY);
int minute= c1.get(Calendar.MINUTE);
TimePickerDialog time = new TimePickerDialog(DialogActivity.this,
// 设置时间的监听器
newOnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, inthourOfDay, int minute) {
showToast(hourOfDay + ":"+ minute);
}
},hourOfDay, minute, true);
dialog = time;
break;
上述代码中,Calendar.getInstance()方法用于获取当前系统的时间。c1.get(Calendar.HOUR_OF_DAY)和c1.get(Calendar.MINUTE)分别用于获取当前系统的小时和分钟数,并填充到TimePickerDialog构造方法的参数里。在回调方法onTimeSet()里,将设置的时间通过Toast显示到屏幕上。
运行程序,结果如图7-14所示:
图7-14时间选择对话框
当点击“Set”按钮时,Toast会显示出设置的时间,如图7-15所示:
图7-15时间设定监听器动作
1.3.9.日期选择对话框
日期选择对话框DatePickerDialog的原理与时间选择对话框类似,只是参数不同,其构造方法如下所示:
DatePickerDialog(Contextcontext, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth)
该构造方法参数的含义与时间选择对话框的类似。下面通过在DialogActivity的onCreateDialog(int)方法中加入一个case来实现日期选择对话框,具体代码如下所示:
日期选择对话框初始化代码清单7-3-9:
case DATE_PICKER_DIALOG:
Calendar c = Calendar.getInstance();
int year =c.get(Calendar.YEAR);
intmonthOfYear = c.get(Calendar.MONTH);
intdayOfMonth = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog date = new DatePickerDialog(DialogActivity.this,
// 设置日期的监听器
newOnDateSetListener() {
@Override
public void onDateSet(DatePicker view, intyear, int monthOfYear,
intdayOfMonth) {
showToast(year + "-" +(monthOfYear + 1) + "-" + dayOfMonth);
}
}, year, monthOfYear, dayOfMonth);
dialog = date;
break;
上述代码在onDateSet()方法里将设置的日期以Toast的形式显示在屏幕上。运行程序,结果如图7-16所示:
图7-16日期选择对话框
当点击“Set”按钮时,Toast会显示出设置的日期,如图7-17所示:
图7-17日期设定监听器动作
1.3.10.自定义对话框
当Android 提供的对话框无法满足需求时,可以自定义一个对话框。下面将通过一个实例介绍如何实现自定义对话框,首先定义自定义对话框的布局文件,具体代码如下所示:
custom_dialog.xml代码清单7-3-10:
<?xml version="1.0"encoding="utf-8"?>
<RelativeLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal"
android:id="@+id/dialog">
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal"
android:id="@+id/dialogname">
<TextView android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/tvUserName"
android:text="姓名:"/>
<EditText android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/etUserName"
android:minWidth="200dip"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal"
android:id="@+id/dialognum"
android:layout_below="@+id/dialogname">
<TextView android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/tvPassWord"
android:text="密码:"/>
<EditText android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/etPassWord"
android:minWidth="200dip"/>
</LinearLayout>
</RelativeLayout>
上述代码实现了一个简单的登录对话框的布局,该布局文件定义了两个EditText和两个TextView,自定义对话框的两个Button使用AlertDialog的Button来实现。
然后在DialogActivity的onCreateDialog(int)方法中加入一个case,具体代码如下所示:
自定义对话框初始化代码清单7-3-10:
/**
* @author小飞飞:我小飞飞从小最最最爱看书了,屋里挂满了码农码神的画像,马克思,恩格
斯,祖冲之,麦当劳哥哥,肯德基叔叔,烤鸡腿,烤羊腿,烤鸭腿……
*/
case CUSTOM_DIALOG:
// 获取自定义的对话的布局
LayoutInflater factory = LayoutInflater.from(this);
final ViewcustomDialogView = factory.inflate(R.layout.custom_dialog, null);
dialog = newAlertDialog.Builder(this).setIcon(android.R.drawable.btn_star)
// 设置布局以及标题
.setTitle("自定义对话框").setView(customDialogView)
.setNegativeButton("取消", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("你取消了选择");
}
}).setPositiveButton("确定", newDialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
EditText userName = (EditText)customDialogView
.findViewById(R.id.etUserName);
EditText password =(EditText)customDialogView
.findViewById(R.id.etPassWord);
showToast("姓名:" + userName.getText().toString() + "密码:"
+password.getText().toString());
}
}).create();
break;
上述代码首先通过LayoutInflater获取定义的布局文件R.layout.custom_dialog,然后通过setView()方法设置AlertDialog的布局,最后设置一个“取消”按钮和一个“确定”按钮,在“确定”按钮的监听器里获取用户填写的用户名和密码,并通过Toast显示到屏幕上。
孔明:LayoutInflater的作用类似于 findViewById(),不同点是LayoutInflater用于查找layout文件夹下的xml布局文件并实例化,而 findViewById()用于查找某一个xml布局文件下具体的 widget控件(例如:Button控件、TextView控件等)。
|
运行程序,结果如图7-18所示:
、
图7-18自定义登录框
首先输入用户名和密码,然后点击确定按钮,结果如图7-19所示:
图7-19点击“确定”按钮
1.4. 玄德有话说
张飞:明明啊,有一个问题我想请教!
孔明:直说无妨!
张飞:对话框的功能其实利用Android的界面控件也可以实现,那为什么要选用对话框,什么时候用对话框呢?
孔明:问得好!其实对话框的功能也可以用PopUpWinidow或者其他界面控件替代。嗯?什么叫PopUpWindow?PopUpWindow会在后面的章节中介绍。平时我们需要慎重使用对话框,因为当对话框显示时,屏幕的其他位置不可点击。过多的使用对话框会使用户体验变差。虽然对话框具有这样的缺点,不过这也正是对话框的特点。可以将对话框应用在当我们希望对用户进行重要的提示或者要求用户进行重要的选择时候。
张飞:原来是这样!
刘备:三弟真是一点就通!
张飞:哎,大哥,你啥时候出场的?
刘备:废话!这节叫玄德有话说,没我怎么行?