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);
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值