android 对话框不消失,如何让 Dialog 不消失

在Android开发中,当需要用户校验输入并保持Dialog显示时,遇到Dialog自动消失的问题。通过分析源码发现,Dialog的`dismiss()`方法在mShowing为true时执行关闭操作。利用反射可以设置mShowing为false,阻止Dialog关闭。然而,这会导致无法正常关闭Dialog,如取消按钮失效。文章探讨了如何在验证失败时保持Dialog显示,以及处理点击屏幕空白区域关闭Dialog的场景。

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

如何让 Dialog 不消失

Android,dialog,

2015-03-06 13:38:08

在做项目的时候,可能会碰到这样的需求,弹一个 Dialog ,用户输入信息,点击确认的时候进行验证,如果输入的信息有误或者不合法,需要让用户继续修改,但是这个时候 Dialog 已经消失了,让 Dialog 再弹出来吗?可不可以让 Dialog 不消失呢?

通过查看源码可以看到,(我其实是先在网上看的,然后再去看的代码),在 android.app.Dialog 类里,dismiss() 方法是 public 的,供需要消失的时候调用的,但 dismiss() 最终调用的是 dismissDialog() ,这个方法才是最终的实现。在 dismiss dialog 的时候,它会判断 mShowing ,如果 mShowing 为 true ,就继续执行,最终 dismiss dialog 。如果 mShowing 为 false ,方法结束,直接 return。

那么我们能做的事情就是让 mShowing 为 false ,虽然现在 dialog 还显示着。但是 mShowing 是 private 的,也没有其他公开的方法可以修改这个变量的值,这就需要用到反射,修改 mShowing 的值。大概其的代码是这样子的。

Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");

field.setAccessible(true);

field.set(dialog, true);

把这段代码加到 DialogInterface.OnClickListener 的 onClick() 方法的实现里,看起来是奏效了。但是有另外一个问题,我通过上面的修改,在点击‘确认’的时候,进行验证,验证不通过我就让 dialog 一直显示不消失,提示用户继续修改。那么这个时候,dialog 是显示的状态,但是 mShowing 是 false 了,也就是以后不能正常的关闭这个 dialog 了。比如我有一个‘取消’的 button ,点取消是没有任何反应的。所以你可以在取消的 click listener 里,用同样的方法,把 mShowing 改成 true 。

那么另外一个问题又来了,点击屏幕的空白区域的时候,dialog 原本是可以消失的。默认是这样子的,但是如果你项目需求已经把它禁掉了,这个问题就不存在了。这个问题怎么解决,后续再说。

相关文章

- EOF -

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动。

转载请注明:文章转载自 Binkery 技术博客 [https://binkery.com]

本文标题: 如何让 Dialog 不消失

本文地址:https://binkery.com/archives/409.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值