什么是Dialog?
Dialog类,是一切对话框的基类.需要注意的是,Dialog类虽然可以在界面上显示,但是并非继承于View类,而是直接从java.lang.Object开始构造出来的.
类似于Activity, Dialog也是有生命周期的,它的生命周期由Activity来维护.Activity负责生成,保存,恢复它.
在生命周期的各个阶段都有一些回调函数供系统反向调用.
在Activity中 用户可以主动调用的函数有:
@ showDialog(int id) 负责显示标识为id的Dialog. 这个函数如果调用后,系统将反向调用Dialog的回调函数onCreateDialog(int id).
@ dismissDialog(int id) 使标识为id的Dialog在界面中消失.
Dialog有两个比较常见的回调函数, onCreateDialog(int id) 和 onPrepareDialog(int id,Dialog dialog) 函数.当在Activity中调用showDialog(int id)后,如果这个Dialog是第一次生成,系统将反向调用Dialog的回调函数onCreateDialog(int id),然后再调用onPrepareDialog(int id,Dialog dialog);如果这个Dialog已经生成,只不过还没有显示出来,那么将不会回调onCreateDialog(int id),而是直接回调onPrepareDialog(int id ,Dialog dialog)方法.
onPrepareDialog(int id,Dialog dialog)方法提供了这样一套机制,即当Dialog生成但是没有显示出来的时候,使得有机会在显示前对Dialog做一些修改,比如Dialog标题等.
了解Dialog的一些基本知识后,来看ActivityMain文件当中onCreate()方法里面的实现代码:
Button bt1 = (Button) findViewById(R.id.button1);
bt1.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
showDialog(DIALOG1);
}
});
代码解释:
findViewById方法通过组件的id返回这个组件的引用.
setOnClickListener方法为bt1设置了一个单击监听器.
onClick()为单击Button后的回调函数.
showDialog()为Activity里边的函数.负责将id为DIALOG1的Dialog显示出来.
执行showDialog(DIALOG)代码后,系统执行回调函数onCreateDialog(),实现代码如下:
protected Dialog onCreateDialog(int id)
{
switch(id)
{
case DIALOG1:
return buildDialog1(ActivityMain.this);
case DIALOG2:
return buildDialog2(ActivityMain.this);
case DIALOG3:
return buildDialog3(ActivityMain.this);
}
return null;
}
代码解释:
针对不同的Dialog的id,生成不同的Dialog.
buildDialog1函数生成的第一个要显示的Dialog.
buildDialog的参数为context.
接下来看看buildDialog1()函数,其实现代码如下:
private Dialog buildDialog1(Context context)
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.drawable.alert_dialog_icon);
builder.setTitle(R.string.alert_dialog_two_buttons_title);
builder.setPositiveButton(R.string.alert_dialog_ok,new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog,int whichButton)
{
setTitle("点击了OK")
}
});
builder.setNegativeButton(R.string.alert_dialog_cancel,new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog,int whichButton)
{
setTitle("点击了cancel");
}
});
return builder.create();
}
代码解释:
AlertDialog.Builder builder = new AlertDialog.Builder(context)语句首先生成一个AlertDialog.Builder的对象,这样就可以开始构造AlertDialog.
builder.setIcon(R.drawable.alert_dialog_icon)语句给AlertDialog预设置一个图片.这里设置的是alert_dialog_icon.png图片.
builder.setTitle(R.string.alert_dialog_two_buttons_title)语句给AlertDialog预设一个标题,标题的字符串内容在value目录的string.xml文件里面定义的.
setPositiveButton()这个方法设置确定按钮的一些属性.第一个参数为按钮上显示出来的内容;第二个参数为DialogInterface.OnClickListener()监听器对象.
onClick()方法为监听器中的回调方法,即当单击Dialog的按钮时,系统回调这个方法. 在这个回调函数里,我们通过setTitle方法,将标题栏的内容进行了重新设置.
setNegativeButton()方法和setPositiveButton()方法对应.
=================
AlertDialog 与 AlertDialog.Builder :
AlertDialog是Dialog的一个直接子类,AlertDialog也是Android系统当中最常用的对话框之一.
一个AlertDialog可以有两个或者三个Button,可以对一个AlertDialog设置title和message.
不能直接通过AlertDialog的构造函数来生成一个AlertDialog.一般生成AlertDialog的时候都是通过它的一个内部静态类AlertDialog.Builder来构造的.
builder.setMessage(R.string.alert_dialog_msg)这个方法是在title下边设置一些信息(message).
setNeutralButton()方法设置中间按钮的一些属性,具体设置方法同setPositiveButton()和setNegativeButton()一样.
=================
预设好所有关于Dialog的属性之后,执行builder.create()后生成一个配置好的Dialog.
当程序执行完onCreateDialog()方法后,接着会执行onPrepareDialog方法. 在onPrepareDialog()方法里面可以对Dialog进行修改.
举个例子:
protected void onPrepareDialog(int id , Dialog dialog)
{
if(id = DIALOG1)
{
setTitle("改变为:");
}
}
此时title就会被改变了.