在学习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相关推荐

  1. 进入Docker 容器 docker exec [CONTAINER ID] bin/bash报错问题

    问题 (base) Eistert-2:xxxx-web eistert$ docker exec -it f365682ef502 /bin/bash OCI runtime exec failed ...

  2. Android fragment源码全解析

    Fragment 相信基本上每个android developer都用过,但是知晓其原理 用的好的还是不多,今天就从源码的角度上来带着大家分析一下Fragment的源码,对fragment有了更深层次 ...

  3. Android 进阶17:Fragment FragmentManager FragmentTransaction 深入理解

    日常开发中我们经常使用 Fragment 管理布局,使用起来非常方便,但是在简单的 API 背后隐藏了什么操作,很多人恐怕不了解. 如果你回答不出这些问题,那这篇文章可能就对你有些帮助: Fragme ...

  4. Android 通过源码解析 Fragment 启动过程

    0x00 作为一名 Android 开发者,大家绝对都接触过 Fragment 开发,而且绝大多数人例如我一直都很难记住下图 Fragment 复杂的生命周期,更别说要将其与 Activity 的生命 ...

  5. android add fragment,fragment中的add和replace方法的区别浅析

    使用 FragmentTransaction 的时候,它提供了这样两个方法,一个 add , 一个 replace ,对这两个方法的区别一直有点疑惑. 我觉得使用 add 的话,在按返回键应该是回退到 ...

  6. 第二章 Fragment

    文章目录 第二章 Fragment (一)定义 (二)作用 (三)生命周期 (1)生命周期方法详解 (2)生命周期调用场景 (3)Fragment与Activity生命周期对比 (3.1)Activi ...

  7. Fragment整理

    基本概念 Fragment,简称碎片,是Android3.0(API 11)提出的,为了兼容低版本,support-V4库中也开发了一套Fragment API,最低兼容Android 1.6 Fra ...

  8. Andriod动态布局

    1.近几日接入一个第3方Geesee的直播视频,碰到一个动态布局的问题,有感而发 需求:点击按钮,切换视频View与文档View的位置.而且文档那个小窗口是可以全屏拖动的,所以 没有将两个View写在 ...

  9. No view found for id 0x7f0f00d7 for fragment

    这是我最近做项目时遇到的一个问题,应为我们的项目要求apk要7*24小时运行,所以在做时间测试的出现了这一个问题.但是这个问题不是固定的位置固定的位置出现,一开始我以为是我的id写的有问题, 改了又改 ...

最新文章

  1. java监控任务进度_Java Swing组件实现进度监视功能示例
  2. 【Java】5.2 方法详解
  3. Maximum Subarray with Sum/ Multiply
  4. 极光推送maven与代码,无需修改,粘贴即用
  5. Spring思维导图,让Spring不再难懂(mvc篇)
  6. mxm智能教育机器人无法智能对话_零代码使用腾讯TBP打造智能对话机器人
  7. 行程日志2010-03-16沙井一村(1)
  8. 转!!存储过程和触发器
  9. python房屋租赁系统的设计与实现_基于ssh的房屋租赁系统的设计与实现(含源文件)...
  10. 手机Linux安装rtl8187L,fedora 19编译安装rtl8187l驱动问题
  11. java将模糊的图片变清晰_java高清图生成缩略图变得模糊
  12. Niushop官网出新版 由内而外 玩转简约时尚风
  13. html炫酷文本框,炫酷的input框实现
  14. suse linux 添加网卡驱动,图文并茂介绍suse linux 11系统安装全过程以及suse系统下安装网卡驱动和刷新固件.doc...
  15. java哨兵模式_哨兵模式详解
  16. 输入今天的日期,输出明天的日期
  17. 3dmax 管子动画_3DMax水管里流水的动画怎么做呢?
  18. [读书笔记]结绳记事
  19. Python文字小游戏
  20. python怎么算反三角函数_用Python计算三角函数之acos()方法的使用

热门文章

  1. 如何实现修改c语言题库,编程培训 所有C语言题库(修改后).docx
  2. python numpy读取数据_Python numpy数据的保存和读取
  3. HttpUrlConnection与HttpClient的认识(六) -实际应用之刷网络流量
  4. stem教育在中国法则
  5. Redis 实战篇:Geo 算法查找附近的人
  6. 微信jsapi支付获取code_微信JSAPI公众号支付在部分机型上出现appid参数错误的解决办法 - YangJunwei...
  7. Mysql面试之索引
  8. 二叉树(Binary Tree):先序遍历、中序遍历、后序遍历和层次遍历
  9. 双网卡“在 TCP 网络上检测出有重复名称”错误
  10. 如何利用laragon框架制作一个简单的应用?