Android Fragment中使用hide/show出現頁面重疊、穿透現象
寫了這麼久的代碼,今天突然發現個問題,在我的項目中,一個主Activity中有三個Fragment,這三個Fragment是通過hide/show來控制隐藏和顯示的,但是,發現,在小米手機上,點選這三個Fragment的時候出現能隐約的看到已經被隐藏的Fragment。還有,在華為手機上,當一個activity奔潰以後重新傳回Fragment的時候,就出現嚴重的界面穿透重疊問題。如圖:
仔細看這三個Fragment,發現界面是亂的,項目中出現的就是這個問題
分析問題:
仔細分析一下,當我從Fragment中跳到其他activity的時候,此時,Fragment所在的activity已經被銷毀,但是通過
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
這個方法來儲存相關狀态和資料。當奔潰以後,再次回到了Fragment所在的activity,此時,該activity就會調用 oncreate方法中,通過該方法中的savedInstanceState參數來恢複Fragment,此時,Fragment中的FragmentTransaction中的相當于又再次add了fragment進去的,之前儲存的fragment也還在。hide()和show()方法對之前儲存的fragment已經失效了。是以出現了重疊的現象。
解決方法如下:
1、 在Fragment中所在的activity中重寫onSaveInstanceState方法,并且把super.onSaveInstanceState(outState); 注釋掉,阻止activity儲存fragment的狀态就可以了,
@Override
protected void onSaveInstanceState(Bundle outState) {
//super.onSaveInstanceState(outState); //将這一行注釋掉,阻止activity儲存fragment的狀态,解決Fragment穿透重疊現象
}
這是最簡單有效的方法。
2、還有一種方法就是在Fragment所在的activity中的oncreate方法中,判斷savedInstanceState是否為null,如果不為null,則表示裡面有儲存這三個fragment。則不再重新去add這三個fragment,而是通過Tag從前儲存的資料中直接去讀取。相關代碼如下:
private FragmentManager fManager;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
fManager = getFragmentManager();
if (savedInstanceState != null) {
businessCenterFragment= (BusinessCenterFragment) fManager.findFragmentByTag("businessCenterFragment");
businessMoneyFragment= (BusinessMoneyFragment) fManager.findFragmentByTag("businessMoneyFragment");
businessMeFragment= (BusinessMeFragment) fManager.findFragmentByTag("businessMeFragment");
}
super.onCreate(savedInstanceState);
}
這種方法仍是對之前儲存的fragment操作,也能解決重疊的問題。
參考資料: http://blog.csdn.net/u014391013/article/details/42497575
https://my.oschina.net/wangxnn/blog/417581