Android 中ViewPager+fragment报异常:IllegalStateException:Can't change tag of fragment的一种解决思路

本文分析了在Android应用中,当使用ViewPager结合Fragment时遇到IllegalStateException异常的原因,特别是当Fragment的tag管理和ViewPager的数据源冲突时。作者提供了一种解决方案,即不手动绑定Fragment的tag,而是利用系统自动提供的tag来找到当前页面的Fragment。此外,还推荐了一篇关于此类异常的常见原因和解决方法的文章链接。

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

       相信查看这篇文章的Android开发者,一定查找过了很多其他的答案。但是这里发现的问题属于失误性的问题,却也能导致这样错误,好了,废话不多说,直接进入正题:

      bug出现的原因:

       在我这个项目中的需求大概就是有一个FragmentA依赖于一个Activity B,FragmentA通过getActivity().startActivityForResult(intent, REQUEST_CODE);跳转到ActivityC并获得返回值,返回给FragmentA。A拿到这个值,然后设置给需要的TextView。但是由于原先采用的方法是ActivityB 为Fragment绑定tag是采用FragmentTransaction transaction = fm.beginTransaction();     transaction.add(Fragment arg0,String tag);对fragment绑定标识,然后通过在ActivityB调用onActivityResult方法,通过Fragment管理器Fragment f = fragmentManager.findFragmentByTag(tag):f.onActivityResult(requestCode, resultCode, data);将数据返回到对应的fragment中,但是这样的方法就会和绑定到viewpager适配器FragmentPagerAdapter的数据源List<Fragment> mDatas冲突了,相当于是绑定了两次同一个fragement(个人理解。)所以报了IllegalStateException异常。

   解决办法:

   不需要绑定fragment的tag,通过系统自动获取就可以了,

    核心代码: Fragment f = fragmentManager.findFragmentByTag("android:switcher:" + R.id.mViewpager+ ":"+ mViewPager.getCurrentItem());

    android:switcher:" + R.id.mViewpager+ ":"+ mViewPager.getCurrentItem()  这个参数能使系统通过自动查找viewpager中fragment的系统唯一tag。通过这个tag将数据返回到调用getActivity().startActivityForResult(intent, REQUEST_CODE)的fragment。因此,问题得以解决。

  顺便记录一下常见的viewpager+fragment报异常:IllegalStateException:Can't change tag of fragment的原因及解决方法,

http://www.yrom.net/blog/2013/07/17/viewpager-cant-change-tag-of-fragment/ 这篇文章的作者总结得很好,报异常的主要原因是getItem的时候,没有判断list里面是否有即将记载进去的那个fragment,所以,在getItem的时候判断一下就可以了,核心代码如下:

                                public Fragment getItem(int position) {
//  Fragment page = null;
//        if (mDatas.size() > position) {
//            page = mDatas.get(position);
//            if (page != null) {
//                return page;
//            }
//        }
//        while (position>=mDatas.size()) {
//         mDatas.add(null);
//        }

                                        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值