在android中当你点击了对话框的按钮以后,不管你是否调用了dismiss()函数,系统本身都会去调用这个函数并且关闭对话框,但是在有些程序中我们必须让对话框保持不消失,如何实现这样的功能呢?这就需要一种欺骗的机制,也就是说当我们点击了按钮以后,让系统以为对话框已经关闭了,这样就不会再关闭对话框了。
具体实现代码如下:
private void setMShowing(DialogInterface dialog, boolean mShowing) {
try {
Field field = dialog.getClass().getSuperclass()
.getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, mShowing);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
} 将上面的代码加到哪个按钮的单击事件中,哪个按钮就再也无法关闭对话框了。如果要关闭对话框,只需再将 mShowing 设为 true 即可。要注意的是,在一个按钮里设置了 mShowing 变量,也会影响另一个按钮的关闭对话框功能,因此,需要在每一个按钮的单击事件里都设置 mShowing 变量的值。
mShowing是Dialog类中的一个私有变量,用来标识对话框是否显示。如果要改变该变量的值,必须通过反射。
将该变量的值设为false,即使调用了dialog.dismiss(),也不会关闭对话框:
public void dismiss() {
if (Looper.myLooper() == mHandler.getLooper()) {
dismissDialog();
} else {
mHandler.post(mDismissAction);
}
}
void dismissDialog() {
if (mDecor == null || !mShowing) {//如果为false,直接返回
return;
}
if (mWindow.isDestroyed()) {
Log.e(TAG, "Tried to dismissDialog() but the Dialog's window was already destroyed!");
return;
}
try {
mWindowManager.removeView(mDecor);
} finally {
if (mActionMode != null) {
mActionMode.finish();
}
mDecor = null;
mWindow.closeAllPanels();
onStop();
mShowing = false;
sendDismissMessage();
}
}
|