如何让 Dialog 不消失

October 23, 2014

Android

在做项目的时候,可能会碰到这样的需求,弹一个 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 ---

评论

  1. 很好的方法,学习了。。

  2. 很好的方法,学习了。。

添加新评论