点击Dialog中的旋钮不关闭窗口的实现方法

点击Dialog中的按钮不关闭窗口的实现方法

阅读评论

在Android实际开发中,我们可能常常需要弹出一个Dialog,让用户输入一些数据,而对用户的输入数据还需要进行一些比如不能为空的验证。但是在正常情况下,用户点击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的值,如下:

点击Dialog中的旋钮不关闭窗口的实现方法try {
	Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
	field.setAccessible(true);
	field.set(dialog, true);
} catch (Exception e) {
	e.printStackTrace();
}