View系列:View问题:在自定义Dialog中使用fragment后报not attached to a context的解决方法

Android 如何在Dialog中使用ViewPager - 简书

需求:实现在DialogFragment中添加ViewPager(Fragment)。

问题:出现下面异常 :java.lang.IllegalArgumentException:No view found for id 0x7f10013 for fragment,提示找不到ViewPager的Id ,而且位置是在Fragment中。

原因:ViewPager在创建 PagerAdapter时,PagerAdapter构造函数需要FragmentManager,而FragmentManager既可以通过 getSupportManager(getFragmentManager) 也可以通过getChildFragmentManager得到 ,上面两种方式对应在 Activity中和 Fragment创建 Fragment ,如果使用不当,就会出现上面异常。

容易出bug 地方:

1.Fragment嵌套Fragment如果使用 getFragmentManager

1>Fragment放ViewPager,ViewPager里面是fragment。第一次进入没问题,再次进入ViewPager的fragment时里面内容就没了,数据丢失

2>Fragment低频率点击切换不会发生问题,过快点击马上崩溃

3>错误:java.lang.IllegalArgumentException:No view found for id for fragment

3>调用fragment的replace方法不走onDestroy()、onDestroyView()方法,无法销毁fragment

4>在fragment中写倒计时,每次切换后倒计时越来越快的问题
 

看下源码:

PagerAdapter adapter = new PagerAdapter(fragmentManager),当实例化Adapter之后,系统会回调 instantiateItem方法,把ViewGroup 的Id 传入进来

@SuppressWarnings("ReferenceEquality")
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        // 省略部分代码
        if (fragment != null) {
            if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
            mCurTransaction.attach(fragment);
        } else {
            fragment = getItem(position);
            if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
            // 这里会往 FragmentManager 里 add 一个 fragment,传入了 container 的id,也就是 ViewGroup 的id
            mCurTransaction.add(container.getId(), fragment,
                    makeFragmentName(container.getId(), itemId));
        }

        return fragment;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值