AlertDialog中默认按键不关闭对话框功能的实现

可以通过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);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值