在开发过程中我们经常需要各种对话框,使用最多的应该就是Dialog;面对不同的需求,可能需要不同的效果。
1,点击返回键,不关闭Dialog
// 默认为 true,为 false 时表示不可取消
mDialog.setCancelable(false);
2,点击返回键,关闭Dialog,并且关闭Activity
当我们点击返回键,需要将整个Activity和Dialog一块关闭时。我们首先想到的就是通过onKeyDown()方法,重写Activity的返回键事件;但结果并不愉快,好像没有达到我们想要的效果。
原来是Dialog抢走了Activity的焦点,Activity不再是当前的焦点,所以无法获取back键事件,因此我们需要重写Dialog的返回键事件:
// 监听 Dialog 的 Key 事件
mDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// 关闭 Dialog
dialog.dismiss();
// 关闭当前 Activity
finish();
// 返回 true,表示返回事件已被处理,不再向下传递
return true;
} else {
return false;
}
}
});
后来又看到另外一种方法,好像更加方便:
// 监听 Cancel 事件
mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// 关闭 Dialog
dialog.dismiss();
// 关闭当前 Activity
finish();
}
});
注意:在设置setCancelable(false)时,setOnCancelListener()无效。
3,点击空白区域不关闭Dialog
这个虽说与返回键无关,但使用场景还是很多的,实现也很简单:
// 点击空白区域不关闭 Dialog(默认为 true)
mDialog.setCanceledOnTouchOutside(false);