之前在維護一個項目,根據(jù)產(chǎn)品需求去改變自定義的Dialog的UI。我很快就修改好了,但是我遇到setCanceledOnTouchOutside(true)
和setCancelable(true)
出現(xiàn)無效的情況唐片。
setCanceledOnTouchOutside方法作用
點擊對話框外部區(qū)域是否允許對話框消失或者說點擊屏幕或物理返回鍵叠蝇,false不消失,true消失风宁。
setCancelable方法作用
點擊手機返回按鍵是否允許對話框消失或者彈出后會點擊屏幕,false不消失,true消失辜昵;點擊物理返回鍵dialog消失。
正常情況設(shè)置:
setCanceledOnTouchOutside(true);
setCancelable(true);
這樣是可以點擊Dialog的外部區(qū)域咽斧,Dialog是會消失的堪置。但是沒有消失,這是為什么呢张惹?
認(rèn)真閱讀了原來的代碼舀锨,發(fā)現(xiàn)有一段代碼是這樣的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WindowManager.LayoutParams params = getWindow().getAttributes();
params.width = ViewGroup.LayoutParams.MATCH_PARENT;
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
getWindow().setAttributes(params);
}
我最后發(fā)現(xiàn)有問題的代碼了,需要重點關(guān)注的:
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
高度設(shè)置成整個window的高度宛逗,于是bug就來了坎匿。當(dāng)高度設(shè)置成全部的時候,整個window都是你的自定義Dialog拧额,所以不存在Dialog外部區(qū)域碑诉,就是說setCanceledOnTouchOutside和setCancelable有效的區(qū)域不存在。
解決方案
代碼如下所示:
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
只要把高度改成包裹內(nèi)容就可以了侥锦。記錄這個意外的bug进栽,希望對看到這篇文章的小伙伴們有幫助。