当前位置: 首页 > web >正文

fragment 异常 InstantiationException

接手的项目过了下firebase和内存泄漏,还是有很多常见共性的问题

 这个异常也是非常常见,但是很多人不会去修复的

Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.healthfitness.me.ui.badgeinfo.BadgeListInfoDialog: could not find Fragment constructorat androidx.fragment.app.Fragment.instantiate(Fragment.java:687)at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57)at androidx.fragment.app.FragmentManager$3.instantiate(FragmentManager.java:525)at androidx.fragment.app.FragmentState.instantiate(FragmentState.java:84)at androidx.fragment.app.FragmentStateManager.<init>(FragmentStateManager.java:91)at androidx.fragment.app.FragmentManager.restoreSaveStateInternal(FragmentManager.java:2562)at androidx.fragment.app.Fragment.restoreChildFragmentState(Fragment.java:1988)at androidx.fragment.app.Fragment.onCreate(Fragment.java:1967)at androidx.fragment.app.Fragment.performCreate(Fragment.java:3094)at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:504)at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:268)

原因是

  • Android 系统在重建 Fragment 时,只能通过无参构造函数反射生成实例
  • 如果自定义了带参数的构造函数,系统无法找到无参构造方法,直接崩溃。

  • 通过 Bundle 传递参数是 Android 的官方推荐做法。

比如很常见的


class BadgeListInfoDialog(private val uId: Long,private val bId: Long,private val isMe: Boolean = true,//表示查看自己的private val badgeUserInfo: BadgeUserInfo? = null,//个人信息private val equipBId: Long?=null,private val mBadgeDetailBean: BadgeDetailBean?=null,//勋章详情,如果外层已经获取到了,就不用再请求了private val isDisBadgeBid: Long?=null
) : BaseDialogFragment<DialogBadgeListInfoBinding>()

BadgeListInfoDialog有了有参数的构造函数,就没有了默认的无参构造函数

所以比如页面销毁重建的时候,就会报这个异常

改造方案

class BadgeListInfoDialog : BaseDialogFragment<DialogBadgeListInfoBinding>() {// 定义参数 Key(避免硬编码)companion object {private const val KEY_UID = "uId"private const val KEY_BID = "bId"private const val KEY_IS_ME = "isMe"private const val KEY_BADGE_USER_INFO = "badgeUserInfo"private const val KEY_EQUIP_BID = "equipBId"private const val KEY_BADGE_DETAIL_BEAN = "badgeDetailBean"private const val KEY_IS_DIS_BADGE_BID = "isDisBadgeBid"// 统一的创建方法fun newInstance(uId: Long,bId: Long,isMe: Boolean = true,badgeUserInfo: BadgeUserInfo? = null,equipBId: Long? = null,badgeDetailBean: BadgeDetailBean? = null,isDisBadgeBid: Long? = null): BadgeListInfoDialog {val args = Bundle().apply {putLong(KEY_UID, uId)putLong(KEY_BID, bId)putBoolean(KEY_IS_ME, isMe)putParcelable(KEY_BADGE_USER_INFO, badgeUserInfo)equipBId?.let { putLong(KEY_EQUIP_BID, it) }putSerializable(KEY_BADGE_DETAIL_BEAN, badgeDetailBean)isDisBadgeBid?.let { putLong(KEY_IS_DIS_BADGE_BID, it) }}return BadgeListInfoDialog().apply {arguments = args}}}// 其他代码...
}

在oncreate中

class BadgeListInfoDialog : BaseDialogFragment<DialogBadgeListInfoBinding>() {// 定义参数变量(添加 lateinit 或可空类型)private lateinit var uId: Longprivate lateinit var bId: Longprivate var isMe: Boolean = trueprivate var badgeUserInfo: BadgeUserInfo? = nullprivate var equipBId: Long? = nullprivate var mBadgeDetailBean: BadgeDetailBean? = nullprivate var isDisBadgeBid: Long? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 从 Bundle 中解析参数arguments?.let { args ->uId = args.getLong(KEY_UID)bId = args.getLong(KEY_BID)isMe = args.getBoolean(KEY_IS_ME, true)badgeUserInfo = args.getParcelable(KEY_BADGE_USER_INFO)equipBId = if (args.containsKey(KEY_EQUIP_BID)) args.getLong(KEY_EQUIP_BID) else nullmBadgeDetailBean = args.getSerializable(KEY_BADGE_DETAIL_BEAN) as? BadgeDetailBeanisDisBadgeBid = if (args.containsKey(KEY_IS_DIS_BADGE_BID)) args.getLong(KEY_IS_DIS_BADGE_BID) else null}}// 其他代码...
}

http://www.xdnf.cn/news/450.html

相关文章:

  • Python语法系列博客 · 第6期[特殊字符] 文件读写与文本处理基础
  • JAVA:Spring Boot 集成 Caffeine 实现本地缓存的技术博客
  • 使用Redis5.X部署一个集群
  • 【PCIE配置空间】
  • 【FFmpeg从入门到精通】第三章-FFmpeg转封装
  • Android TTY设备调用流程和简单分析
  • verilog float mult
  • 九方前端面试
  • Kubernetes控制平面组件:API Server详解(二)
  • TDOA解算——牛顿迭代法|以4个基站的三维空间下TDOA定位为背景,使用牛顿迭代法解算。附完整代码,订阅专栏后可复制粘贴
  • 前端面试宝典---参数解构+默认值的面试题
  • 2025.04.19【Spider】| 蜘蛛图绘制技巧精解
  • 杨校老师课堂之C++入门练习题梳理
  • 大数据建模与评估
  • 【技术派后端篇】技术派中的白名单机制:基于Redis的Set实现
  • 备份jenkins
  • mysql控制单表数据存储及单实例表创建
  • MCP是什么?为什么突然那么火?
  • Ubuntu开启自启动PostgreSQL读取HDD失败处理思路
  • 动态规划经典例题:最长单调递增子序列、完全背包、二维背包、数字三角形硬币找零
  • Linux Privilege Escalation: LD_PRELOAD
  • 实战设计模式之备忘录模式
  • Python爬虫实战:获取B站查询数据
  • 【T型三电平仿真】SVPWM调制
  • stack和queue的使用和模拟实现
  • 【Linux】线程ID、线程管理、与线程互斥
  • 【Hot100】 73. 矩阵置零
  • 红帽RHEL与国产Linux系统对比:技术、生态与自主可控的博弈
  • 深入理解 Java 多线程:锁策略与线程安全
  • uniapp-x 二维码生成