AlertDialog对话框的控制

1.场景:Dialog中有EditView输入框,当输入的内容不符合要求时,此时对话框不关闭

AlertDialog 并没有提供该方法,需要通过反射的方式去获取到源码中的方法,去自定义Dialog的关闭。

备注:AlertDialog.Builder 添加引用时注意,必须是 import android.support.v7.app.AlertDialog;可通过反射获取到getDeclaredField 参数为 mShowing

v4包下的Dialog反射获取不到 getDeclaredField

代码如下:

关闭Dialog

public void dialogClose(DialogInterface dialog) {
    try {
        Field field = dialog.getClass().getSuperclass().getSuperclass().getDeclaredField("mShowing");
        field.setAccessible(true);
        //  将mShowing变量设为false,表示对话框已关闭
        field.set(dialog, true);
        dialog.dismiss();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

不关闭Dialog

public void dialogNoClose(DialogInterface dialog) {
    try {
        Field field = dialog.getClass().getSuperclass().getSuperclass().getDeclaredField("mShowing");
        field.setAccessible(true);
        field.set(dialog, false);
        dialog.dismiss();
    } catch (Exception e) {
        e.printStackTrace();
   }
}

2.场景:Dialog中存在listview ,操作listview的item,当操作结束之后,需要自动关闭Dialog

在Dialog显示出后,获取到Dialog的对象,如:AlertDialog showDialog = dialog.show();

这次就可以随心所欲地在你需要的地方自动关闭Dialog

3.场景:当在Fragment中,弹出Dialog,此时需要获取到onKeyDown中的事件,做相应 的操作

Dialog中提供了setOnKeyListener监听,在show();方法之前,之后调用无法监听此时事件

代码如下:

builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {

})
.create()
.show();

你可能感兴趣的:(AlertDialog对话框的控制)