目前的许多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);
}
}