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

本文探讨了在Android DialogFragment中使用ViewPager时遇到的‘java.lang.IllegalArgumentException:No view found for id’异常。问题源于在创建PagerAdapter时,使用了错误的FragmentManager。当在Fragment中嵌套Fragment并使用ViewPager时,应特别注意使用getChildFragmentManager(),否则可能导致数据丢失、应用崩溃或其他异常行为。此外,还分析了源码中关于如何添加Fragment到ViewPager的相关细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值