1.场景:Dialog中有EditView输入框,当输入的内容不符合要求时,此时对话框不关闭
AlertDialog 并没有提供该方法,需要通过反射的方式去获取到源码中的方法,去自定义Dialog的关闭。
备注:AlertDialog.Builder 添加引用时注意,必须是 import android.support.v7.app.AlertDialog;可通过反射获取到getDeclaredField 参数为 mShowing
v4包下的Dialog反射获取不到 getDeclaredField
代码如下:
关闭Dialog
public void dialogClose(DialogInterface dialog) {
try {
Field field = dialog.getClass().getSuperclass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
// 将mShowing变量设为false,表示对话框已关闭
field.set(dialog, true);
dialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
}
不关闭Dialog
public void dialogNoClose(DialogInterface dialog) {
try {
Field field = dialog.getClass().getSuperclass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, false);
dialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
}
2.场景:Dialog中存在listview ,操作listview的item,当操作结束之后,需要自动关闭Dialog
在Dialog显示出后,获取到Dialog的对象,如:AlertDialog showDialog = dialog.show();
这次就可以随心所欲地在你需要的地方自动关闭Dialog
3.场景:当在Fragment中,弹出Dialog,此时需要获取到onKeyDown中的事件,做相应 的操作
Dialog中提供了setOnKeyListener监听,在show();方法之前,之后调用无法监听此时事件
代码如下:
builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
})
.create()
.show();
网友评论