可以通过AlertDialog.Builder来操作AlertDialog。通过AlertDialog.Builder类的setNagtiveButton()、setNeutralButton()和setPositiveButton()方法设置对话框的左、中和右键,如图1所示。
图1 AlertDialog类的三个按键
可以通过以上三个方法设置按键显示的内容和点击响应。但是通过这种方法设置的点击响应,在执行完之后会关闭该AlertDialog对话框。如果不想关闭该对话框,可以通过以下两种方式实现,一种是通过按键控件设置自身的点击响应来实现不关闭对话框;另外一种是通过控制变量来实现不关闭对话框。
1 通过按键控件设置自身的点击响应
在前面提到,使用setNagtiveButton()、setNeutralButton()和setPositiveButton()方法设置按键控件的单击响应时,会关闭AlertDialog对话框。而直接通过按键控件设置自身的点击响应则不会关闭AlertDialog对话框。
1.1 设置按键显示内容
首先通过上述三个方法只设置按键显示的内容,而不设置其响应例程。
builder.setPositiveButton("返回上一层", null);
其中,builder是AlertDialog.Builer类的对象,setPositiveButton()方法的第一个参数为按键显示的内容,第二个参数为点击响应例程。
1.2 设置按键点击响应例程
接下来获取AlertDialog类对话框中Positive Button(右键)控件,然后通过该控件设置其点击响应例程。
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
其中,dialog是AlertDialog类的对象,可以通过AlertDialog.Builder类的对象获取。通过AlertDialog类的对象调用getButton()方法获取指定的Button,该方法的参数是指定Button的ID,而AlertDialog.BUTTON_POSITIVE是右键控件的ID。在获取了Button之后,调用Button类的setOnClickListener()方法设置按键的点击响应例程。
通过该方法设置的点击响应例程,点击按键之后,不会关闭AlertDialog对话框。
1.3 关闭对话框
如果需要关闭AlertDialog对话框,可通过调用dismiss()方法实现。
dialog.dismiss();
2 通过控制变量实现
在对话框父类中有一个布尔类型的变量mShowing来控制对话框的显示或关闭。当该变量的值是false时则显示对话框,是true时则关闭对话框。可用通过将该变量设置为false来实现不关闭AlertDialog对话框。
2.1 获取mShowing域
要设置变量mShowing的值,首先要获取该变量在对话框父类中的域
java.lang.reflect.Field field =
dialog.getClass().getSuperclass().getDeclaredField("mShowing");
其中,dialog是AlertDialog类的对象,通过该对象调用getClass()方法返回AlertDialog类的实例;接下来调用getSuperclass()返回该类的父类;最后调用父类的getDeclaredField()方法获取父类中的指定域。
2.2 设置域的访问权限
要修改mShowing域的值,就必须要有权限来访问该域。
field.setAccessible(true);
2.3 设置域的值
最后,将mShowing域的值设置为false。
field.set(dialog, true);
其中,set方法的第一个参数指定了父类的派生类,即想让哪个对话框不关闭;第二个参数为mShowing的值。
将以上代码放置到使用setNagtiveButton()、setNeutralButton()和setPositiveButton()方法设置按键控件的单击响应中。需要注意的是,getDeclaredField()、setAccessible()和set()三个方法都要抛出异常,所以在使用以上代码时,需要用到try ...catch语句。
try
{
java.lang.reflect.Field field =
dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, false);
}
catch(Exception e)
{
e.printStackTrace();
}
2.4 关闭对话框
如果要关闭对话框,只需将set()方法的第二个参数设置为true即可。
field.set(dialog, true);