在開發(fā)過(guò)程中我們經(jīng)常需要各種對(duì)話框挟鸠,使用最多的應(yīng)該就是Dialog叉信;面對(duì)不同的需求,可能需要不同的效果艘希。
1硼身,點(diǎn)擊返回鍵硅急,不關(guān)閉Dialog
// 默認(rèn)為 true,為 false 時(shí)表示不可取消
mDialog.setCancelable(false);
2佳遂,點(diǎn)擊返回鍵营袜,關(guān)閉Dialog,并且關(guān)閉Activity
當(dāng)我們點(diǎn)擊返回鍵丑罪,需要將整個(gè)Activity和Dialog一塊關(guān)閉時(shí)荚板。我們首先想到的就是通過(guò)onKeyDown()方法,重寫Activity的返回鍵事件吩屹;但結(jié)果并不愉快跪另,好像沒(méi)有達(dá)到我們想要的效果。
原來(lái)是Dialog搶走了Activity的焦點(diǎn)祟峦,Activity不再是當(dāng)前的焦點(diǎn)罚斗,所以無(wú)法獲取back鍵事件,因此我們需要重寫Dialog的返回鍵事件:
// 監(jiān)聽 Dialog 的 Key 事件
mDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// 關(guān)閉 Dialog
dialog.dismiss();
// 關(guān)閉當(dāng)前 Activity
finish();
// 返回 true宅楞,表示返回事件已被處理针姿,不再向下傳遞
return true;
} else {
return false;
}
}
});
后來(lái)又看到另外一種方法,好像更加方便:
// 監(jiān)聽 Cancel 事件
mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// 關(guān)閉 Dialog
dialog.dismiss();
// 關(guān)閉當(dāng)前 Activity
finish();
}
});
注意:在設(shè)置setCancelable(false)時(shí)厌衙,setOnCancelListener()無(wú)效距淫。
3,點(diǎn)擊空白區(qū)域不關(guān)閉Dialog
這個(gè)雖說(shuō)與返回鍵無(wú)關(guān)婶希,但使用場(chǎng)景還是很多的榕暇,實(shí)現(xiàn)也很簡(jiǎn)單:
// 點(diǎn)擊空白區(qū)域不關(guān)閉 Dialog(默認(rèn)為 true)
mDialog.setCanceledOnTouchOutside(false);