Alert Dialog 点击按钮使对话框不关闭

本文介绍了一种技巧,通过修改对话框内部状态来防止其被系统正常关闭。利用反射技术设置私有变量mShowing,使系统误判对话框已关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     由于系统通过调用dismiss来关闭对话框,那么我们可以在dismiss方法上做点文章。在系统调用dismiss方法时会首先判断对话框是否已经关闭,如果对话框已经关闭了,就会退出dismiss方法而不再继续关闭对话框了。因此,我们可以欺骗一下系统,当调用dismiss方法时我们可以让系统以为对话框已经关闭(虽然对话框还没有关闭),这样dismiss方法就失效了,这样即使系统调用了dismiss方法也无法关闭对话框了。
    下面让我们回到AlertDialog的源代码中,再继续跟踪到AlertDialog的父类Dialog的源代码中。找到dismissDialog方法。实际上,dismiss方法是通过dismissDialog方法来关闭对话框的:

 private   void  dismissDialog() {
         if  (mDecor  ==   null ) {
             if  (Config.LOGV) Log.v(LOG_TAG,
                     " [Dialog] dismiss: already dismissed, ignore " );
             return ;
        }
         if  ( ! mShowing) {
             if  (Config.LOGV) Log.v(LOG_TAG,
                     " [Dialog] dismiss: not showing, ignore " );
             return ;
        }

        mWindowManager.removeView(mDecor);

        mDecor  =   null ;
        mWindow.closeAllPanels();
        onStop();
        mShowing  =   false ;
        
        sendDismissMessage();
    }

该方法后面的代码不用管它,先看 if(!mShowing){ … } 这段代码。这个 mShowing 变量就是判断对话框是否已关闭的。因此,我们在代码中通过设置这个变量就可以使系统认为对话框已经关闭,就不再继续关闭对话框了。由于 mShowing 也是 private 变量,因此,也需要反射技术来设置这个变量。我们可以在对话框按钮的单击事件中设置 mShowing ,代码如下:

不关闭对话框:

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


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值