[原創] Fragment的添加、移除問題


安卓一直在進化,Fragment就是個好東西,如果早5年做安卓開發,真要麻煩的多。

 

關於Fragment的講解,這里很詳盡:

Android Fragment 真正的完全解析(上)

Android Fragment 真正的完全解析(下)

看完后可以進行Fragment的基本功能使用,最廣為人知的就是微信主界面的例子了。

 

一般情況下,多個Fragment切換顯示不同內容,會使Fragment實例化一個空的FrameLayout界面布局,並且初始化一個Fragment填充該布局。

而我的產品設計並非如此,所以使用時有了問題,通過FragmentManager很好地解決了問題,於此記之。

 

問題描述:

Activity里的FrameLayout非空,有子布局ListView,在點擊按鈕后調用Fragment填充該FrameLayout,這樣ListView就被替換掉,不顯示。代碼如下:

private FragmentManager frg_mng = getFragmentManager(); //全局變量
FragmentTransaction ft = frg_mng.beginTransaction();
switch(s) {
case a:
  ft.replace(R.id.layout_note_list, mInfo_frg).commit();
break;
case b:
  ft.replace(R.id.layout_note_list, mUsers_frg).commit();
break;
}

 此時兩個Fragment mInfo_frg和mUsers_frg互相切換,那么如何顯示Fragment所填充的FrameLayout下的ListView呢?顯然要關閉兩個Fragment,使用remove()方法可實現。

即:

FragmentTransaction ft = frg_mng.beginTransaction();
ft.remove(mUsers_frg).commit();
ft.remove(mInfo_frg).commit();

但是Fragment移除后,主Activity出錯閃退。其原因是定義一次beginTransaction()方法只能commit()提交一次,要關閉兩個Fragment,需要定義兩個beginTransaction(),即:

FragmentTransaction ft_a = frg_mng.beginTransaction();
FragmentTransaction ft_b = frg_mng.beginTransaction();
ft_a.remove(mUsers_frg).commit();
ft_b.remove(mInfo_frg).commit();

這樣,兩個Fragment都順利關閉,不再鳩占鵲巢,原FrameLayout下的ListView自然就能顯示了,問題解決。

注意:在第一段代碼中使用了switch語句做條件判斷,這樣beginTransaction()就只commit()一次,否則也存在重復提交問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM