安卓一直在進化,Fragment就是個好東西,如果早5年做安卓開發,真要麻煩的多。
關於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()一次,否則也存在重復提交問題。