Can't change container ID of fragment
在学习kotlin的过程中,使用viewpager+fragment+BottomNavigationView想实现滑动切换页面效果。
我在viewpager的onPageSelected中滑动就切换到指定页,以为是要进行fragment的add或者replace操作,然后看到各路大神纷纷推荐kotlin中优雅地添加fragment,就去跟着人家搞什么扩展函数,具体是这篇文章:
使用Kotlin优雅的添加Fragment
结果就出现这个bug了,这个意思是说不能修改fragment的容器id。
然后捏,老半天百度,没有解决。就在这时,突然看到别人的某某源码分析,然后我才静下心来分析下。哦,原来我在setAdapter设置了fragment数组以后,FragmentPagerAdapter人家自动就给你各种add事务操作了,具体我看到有这段,应该是初始化操作吧:
这里可以看到就有各种事务操作了,这其中就有添加容器id,所以我再去add或者replace就不能更改containerId了。报错原因是BackStackRecord源码里面有个方法是这么写的:
private void doAddOp(int containerViewId, Fragment fragment, @Nullable String tag, int opcmd) {Class fragmentClass = fragment.getClass();int modifiers = fragmentClass.getModifiers();if (fragmentClass.isAnonymousClass() || !Modifier.isPublic(modifiers) || fragmentClass.isMemberClass() && !Modifier.isStatic(modifiers)) {throw new IllegalStateException("Fragment " + fragmentClass.getCanonicalName() + " must be a public static class to be properly recreated from" + " instance state.");} else {fragment.mFragmentManager = this.mManager;if (tag != null) {if (fragment.mTag != null && !tag.equals(fragment.mTag)) {throw new IllegalStateException("Can't change tag of fragment " + fragment + ": was " + fragment.mTag + " now " + tag);}fragment.mTag = tag;}if (containerViewId != 0) {if (containerViewId == -1) {throw new IllegalArgumentException("Can't add fragment " + fragment + " with tag " + tag + " to container view with no id");}if (fragment.mFragmentId != 0 && fragment.mFragmentId != containerViewId) {throw new IllegalStateException("Can't change container ID of fragment " + fragment + ": was " + fragment.mFragmentId + " now " + containerViewId);}fragment.mContainerId = fragment.mFragmentId = containerViewId;}this.addOp(new BackStackRecord.Op(opcmd, fragment));}}
关于BackStackRecord这个类,可以看:Android进阶——Fragment详解之操作原理(三)
这个方法是执行添加fragment的操作,这里在adapter的初始化方法中已经把container的id传过去了,但是我可能脑子不知道短路还是咋的,又去布局里面放了个FrameLayout把viewPager给放进去了,把FrameLayout当作容器,人家本来是以ViewPager为容器的,所以当然第二次的时候容器id不一样了,就报错了。
Can't change container ID of fragment相关推荐
- 进入Docker 容器 docker exec [CONTAINER ID] bin/bash报错问题
问题 (base) Eistert-2:xxxx-web eistert$ docker exec -it f365682ef502 /bin/bash OCI runtime exec failed ...
- Android fragment源码全解析
Fragment 相信基本上每个android developer都用过,但是知晓其原理 用的好的还是不多,今天就从源码的角度上来带着大家分析一下Fragment的源码,对fragment有了更深层次 ...
- Android 进阶17:Fragment FragmentManager FragmentTransaction 深入理解
日常开发中我们经常使用 Fragment 管理布局,使用起来非常方便,但是在简单的 API 背后隐藏了什么操作,很多人恐怕不了解. 如果你回答不出这些问题,那这篇文章可能就对你有些帮助: Fragme ...
- Android 通过源码解析 Fragment 启动过程
0x00 作为一名 Android 开发者,大家绝对都接触过 Fragment 开发,而且绝大多数人例如我一直都很难记住下图 Fragment 复杂的生命周期,更别说要将其与 Activity 的生命 ...
- android add fragment,fragment中的add和replace方法的区别浅析
使用 FragmentTransaction 的时候,它提供了这样两个方法,一个 add , 一个 replace ,对这两个方法的区别一直有点疑惑. 我觉得使用 add 的话,在按返回键应该是回退到 ...
- 第二章 Fragment
文章目录 第二章 Fragment (一)定义 (二)作用 (三)生命周期 (1)生命周期方法详解 (2)生命周期调用场景 (3)Fragment与Activity生命周期对比 (3.1)Activi ...
- Fragment整理
基本概念 Fragment,简称碎片,是Android3.0(API 11)提出的,为了兼容低版本,support-V4库中也开发了一套Fragment API,最低兼容Android 1.6 Fra ...
- Andriod动态布局
1.近几日接入一个第3方Geesee的直播视频,碰到一个动态布局的问题,有感而发 需求:点击按钮,切换视频View与文档View的位置.而且文档那个小窗口是可以全屏拖动的,所以 没有将两个View写在 ...
- No view found for id 0x7f0f00d7 for fragment
这是我最近做项目时遇到的一个问题,应为我们的项目要求apk要7*24小时运行,所以在做时间测试的出现了这一个问题.但是这个问题不是固定的位置固定的位置出现,一开始我以为是我的id写的有问题, 改了又改 ...
最新文章
- java监控任务进度_Java Swing组件实现进度监视功能示例
- 【Java】5.2 方法详解
- Maximum Subarray with Sum/ Multiply
- 极光推送maven与代码,无需修改,粘贴即用
- Spring思维导图,让Spring不再难懂(mvc篇)
- mxm智能教育机器人无法智能对话_零代码使用腾讯TBP打造智能对话机器人
- 行程日志2010-03-16沙井一村(1)
- 转!!存储过程和触发器
- python房屋租赁系统的设计与实现_基于ssh的房屋租赁系统的设计与实现(含源文件)...
- 手机Linux安装rtl8187L,fedora 19编译安装rtl8187l驱动问题
- java将模糊的图片变清晰_java高清图生成缩略图变得模糊
- Niushop官网出新版 由内而外 玩转简约时尚风
- html炫酷文本框,炫酷的input框实现
- suse linux 添加网卡驱动,图文并茂介绍suse linux 11系统安装全过程以及suse系统下安装网卡驱动和刷新固件.doc...
- java哨兵模式_哨兵模式详解
- 输入今天的日期,输出明天的日期
- 3dmax 管子动画_3DMax水管里流水的动画怎么做呢?
- [读书笔记]结绳记事
- Python文字小游戏
- python怎么算反三角函数_用Python计算三角函数之acos()方法的使用
热门文章
- 如何实现修改c语言题库,编程培训 所有C语言题库(修改后).docx
- python numpy读取数据_Python numpy数据的保存和读取
- HttpUrlConnection与HttpClient的认识(六) -实际应用之刷网络流量
- stem教育在中国法则
- Redis 实战篇:Geo 算法查找附近的人
- 微信jsapi支付获取code_微信JSAPI公众号支付在部分机型上出现appid参数错误的解决办法 - YangJunwei...
- Mysql面试之索引
- 二叉树(Binary Tree):先序遍历、中序遍历、后序遍历和层次遍历
- 双网卡“在 TCP 网络上检测出有重复名称”错误
- 如何利用laragon框架制作一个简单的应用?