【Android】AlertDialog点击按钮后不自动关闭对话框

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:39   1810   0

在android中当你点击了对话框的按钮以后,不管你是否调用了dismiss()函数,系统本身都会去调用这个函数并且关闭对话框,但是在有些程序中我们必须让对话框保持不消失,如何实现这样的功能呢?这就需要一种欺骗的机制,也就是说当我们点击了按钮以后,让系统以为对话框已经关闭了,这样就不会再关闭对话框了。

具体实现代码如下:

private void setMShowing(DialogInterface dialog, boolean mShowing) {
  try {
   Field field = dialog.getClass().getSuperclass()
     .getDeclaredField("mShowing");
   field.setAccessible(true);
   field.set(dialog, mShowing);
  } catch (NoSuchFieldException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   e.printStackTrace();
  }
 }
将上面的代码加到哪个按钮的单击事件中,哪个按钮就再也无法关闭对话框了。如果要关闭对话框,只需再将 mShowing 设为 true 即可。要注意的是,在一个按钮里设置了 mShowing 变量,也会影响另一个按钮的关闭对话框功能,因此,需要在每一个按钮的单击事件里都设置 mShowing 变量的值。

mShowing是Dialog类中的一个私有变量,用来标识对话框是否显示。如果要改变该变量的值,必须通过反射。

将该变量的值设为false,即使调用了dialog.dismiss(),也不会关闭对话框:

public void dismiss() {
        if (Looper.myLooper() == mHandler.getLooper()) {
            dismissDialog();
        } else {
            mHandler.post(mDismissAction);
        }
    }

    void dismissDialog() {
        if (mDecor == null || !mShowing) {//如果为false,直接返回
            return;
        }

        if (mWindow.isDestroyed()) {
            Log.e(TAG, "Tried to dismissDialog() but the Dialog's window was already destroyed!");
            return;
        }

        try {
            mWindowManager.removeView(mDecor);
        } finally {
            if (mActionMode != null) {
                mActionMode.finish();
            }
            mDecor = null;
            mWindow.closeAllPanels();
            onStop();
            mShowing = false;
            
            sendDismissMessage();
        }
    }




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP