? ? ? ? ?app需要幾個(gè)彈窗功能,而且界面需要自定義,我看了網(wǎng)上一些關(guān)于DialogFragment的優(yōu)點(diǎn)后決定使用dialogfragment。這里我有三個(gè)不同的彈窗,分別為開始、暫停和結(jié)束。使用過程中出現(xiàn)一個(gè)問題,就是每次我點(diǎn)擊開始彈窗然后將開始彈窗dismiss后,彈窗會(huì)閃一下然后立刻浮現(xiàn)出來。而如果在一個(gè)加載彈窗結(jié)束后啟動(dòng)開始彈窗就不會(huì)有這個(gè)問題。暫停彈窗沒有這個(gè)問題,結(jié)束彈窗也有這個(gè)問題,下面會(huì)解釋一下出現(xiàn)問題的原因。
開始彈窗
經(jīng)過很久的觀察比對(duì)研究,排除了很多原因后,終于知道是我在Activity的onCreate里面加入了橫屏語(yǔ)句,然后顯示開始彈窗。橫屏語(yǔ)句如下,在查詢了橫屏的生命周期后知道由豎屏切換到橫屏,先是豎屏啟動(dòng),onCreate里面的代碼執(zhí)行了一次,onCreate -->onStart-->onResume之后切換橫屏,繼續(xù)以下周期onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy,實(shí)際上并不會(huì)因?yàn)槲覚M屏語(yǔ)句寫在onCreate里面,橫屏語(yǔ)句后面的代碼就不執(zhí)行了,執(zhí)行完豎屏的onCreate后會(huì)再次執(zhí)行橫屏的onCreate,自己也驗(yàn)證過了。這就導(dǎo)致創(chuàng)建了兩個(gè)開始彈窗,所以需要關(guān)閉兩次。而為什么在一個(gè)加載彈窗結(jié)束后啟動(dòng)開始彈窗就不會(huì)有這個(gè)問題呢?那是因?yàn)樵诩虞d彈窗結(jié)束后顯示開始彈窗,則開始彈窗只創(chuàng)建了一次。
/**
* 設(shè)置為橫屏
*/
????if(getRequestedOrientation()!=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
????setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//顯示開始彈窗
????showStartDialog();
}
解決辦法
在MainFest文件的此activity中加入android:configChanges="keyboardHidden|orientation|screenSize這句話即可,這句話會(huì)讓activity橫豎屏切換時(shí)不再執(zhí)行生命周期。
結(jié)束彈窗
結(jié)束彈窗不是在onCreate中創(chuàng)建卻還是會(huì)閃回彈出,后發(fā)現(xiàn)是同樣的原因,即創(chuàng)建了兩次。因?yàn)槲以谝粋€(gè)自定義控件的onDraw里面寫了一個(gè)判斷條件進(jìn)行回調(diào),執(zhí)行代碼如下:
```
onDraw(Canvas canvas){
if(fallObjects.get(fallObjects.size() -1).getIsOver()){
callBackListener.OnClickButton();
? ? score =0;
? ? Log.e("END", "onDraw: + end" );
}else if(drawing){
// 隔一段時(shí)間重繪一次
? ? getHandler().postDelayed(runnable, intervalTime);
}
}
```
而此回調(diào)不知為何也會(huì)執(zhí)行兩次,導(dǎo)致彈出了兩次結(jié)束彈窗。
后面加一個(gè)變量進(jìn)行控制,只記錄第一次返回即可。
之所以這個(gè)問題想了好久,是因?yàn)榇驍帱c(diǎn)也看不出問題,而且是沒有報(bào)錯(cuò)的,導(dǎo)致后來我在網(wǎng)上查找原因的時(shí)候把很多dialogfragment報(bào)錯(cuò)的解釋都忽略了,其實(shí)是一種問題。