在Android实际开发中,我们可能常常需要弹出一个Dialog,让用户输入一些数据,而对用户的输入数据还需要进行一些比如不能为空的验证。但是在正常情况下,用户点击Dialog中的按钮后窗口会随即关闭,用户可能看不到你的错误提示,这样会显得很不友好。那有没有一种解决办法,可以让用户输入出错时单击按钮,继续留在页面而不是关闭本dialog呢?今天在工作中刚好碰到了这个问题,下面介绍一下我的解法办法。
首先看一个截图:
稍微解释一下需求,点击图中的“自定义”按钮弹出添加自定义零件的AlertDialog,该AlertDialog中的零件名称和单价是必填的,当用户没有填零件名称或单价时会给出提示而该AlertDialog不关闭。
看了一下Dialog的源代码,它有一个mShowing成员变量(private boolean mShowing = false;),当点击dialog上的按钮时会先判断mShowing的值,如果为true表示窗口正打开,就将其关闭,反之亦反。所以,我们可以通过手动设置mShowing的值来达到目的。
如上图,我会在点击“保存”按钮时进行用户输入验证,于是我在“保存”按钮的onClick事件中加入下面的代码就可以了:
if(ljmc==null || ljmc.equals("")){ diaCustomName.setError("自定义零件名称不能为空!"); //进行以下设置将不能关闭dialog try { Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing"); field.setAccessible(true); field.set(dialog, false); } catch (Exception e) { e.printStackTrace(); } }
前面说了,mShowing是Dialog类的一个成员变量,在上面的方法中改变之后会影响别的按钮,如现在点击“取消”按钮将不能关闭对话框,解决办法在“取消”的onClick事件中再改变mShowing的值,如下:
try {
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, true);
} catch (Exception e) {
e.printStackTrace();
}