Fragment深度使用解析

    目前的許多app  都會使用到Fragment 中嵌套 ViewPage,然後在嵌套的ViewPage中添加Fragment。

在這種模式實現的時候要特別注意,因爲會出現ViewPage中Fragment的ui不被加載的問題(問題復現的方法:點擊ViewPage

中的任意一個頁面,在點擊退出,在點擊進入同一個頁面。目前我就發現這樣操作會出現問題,大家如有發現其他方式也可告知我,

我會跟新出來)。

問題出現了, 那我們就要想辦法解決這個問題。 其實這個問題的根本原因是因爲大家在使用Fragment的時候會用到一個方法

FragmentActivity的getSupportFragmentManager()方法,這個方法在第一級添加Fragment的時候  是沒有問題的。 當你在Fragment中

添加ViewPage,又在ViewPage中添加Fragment的時候,就不能使用這個方法了, 就要用getChildFragmentManager這個方法了,

兩個方法都是返回FragmentManager,但是getChildFragmentManager這個方法是Fragment類的.(請注意看這個紅色字體)。

具體的代碼實例 如下:

getSupportFragmentManager的使用(我的代碼是在FragmentActivity類,或FragmentActivity子類中實現):

mFragmentTransaction = getSupportFragmentManager().beginTransaction();
mFragmentMainLayout = new FragmentMainLayout();
mFragmentTransaction.replace(R.id.main_content_ll, mFragmentMainLayout).commit();


getChildFragmentManager的使用(代碼是在Fragment類,或Fragment的子類中實現)

FragmentManager fragmentManager = getChildFragmentManager();
List<String> mListTitles = new ArrayList<String>();
mListTitles.add("AA");
mListTitles.add("BB");
mListTitles.add("CC");
mListTitles.add("DD");
mListTitles.add("EE");
MyPageAdapter mMyPageAdapter = new MyPageAdapter(fragmentManager,
mListTitles);
mViewPager.setAdapter(mMyPageAdapter);

注意:在使用getChildFragmentManager的時候,還要在所有用到這個方法的Fragment中重寫一下以下方法:

@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class
.getDeclaredField("mChildFragmentManager");


childFragmentManager.setAccessible(true);


childFragmentManager.set(this, null);


} catch (NoSuchFieldException e) {


new RuntimeException(e);


} catch (IllegalAccessException e) {


new RuntimeException(e);
}
}


發佈了36 篇原創文章 · 獲贊 43 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章