fragment 异常 InstantiationException

解决白天黑夜模式切换导致Fragment崩溃问题 ​ 这几天做项目的时候,发现白天黑夜模式切换的时候,应用会崩溃。崩溃日志如下: Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment xxx.MainPageFragment: could not find Fragment constructor at androidx.fragment.app.Fragment.instantiate(Fragm 阅读详情

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

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

Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.healthfitness.me.ui.badgeinfo.BadgeListInfoDialog: could not find Fragment constructor
                 	at 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: Long
    private lateinit var bId: Long
    private var isMe: Boolean = true
    private var badgeUserInfo: BadgeUserInfo? = null
    private var equipBId: Long? = null
    private var mBadgeDetailBean: BadgeDetailBean? = null
    private var isDisBadgeBid: Long? = null

    override 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 null
            mBadgeDetailBean = args.getSerializable(KEY_BADGE_DETAIL_BEAN) as? BadgeDetailBean
            isDisBadgeBid = if (args.containsKey(KEY_IS_DIS_BADGE_BID)) args.getLong(KEY_IS_DIS_BADGE_BID) else null
        }
    }

    // 其他代码...
}

什么情况下Activity会被杀掉呢? Android底层还是基于Linux,在Linux中低内存是会有oom killer去杀掉一些进程去释放内存,而Android中的就是在此基础上做了一些调整来的。因为手机上的内存毕竟比较有限,而Android中APP在不使用之后并不是马上被杀掉,虽然上层中也有很多关于进程的调度以及杀进程的手段,但是毕竟还需要考虑手机剩余内存的实际情况,lowmemorykiller的作用就是当内存比较紧张的时候去及时杀掉一些还没来得及杀掉但是对用户来说不那么重要的进程,回收一些内存,保证手机的正常运行。 阅读详情

相关推荐

浅析Fragment为什么需要Public的empty constructor

最近,在做一个项目。当app启动后,然后使其进入后台进程(按home键),接着使用其它app(用其它app的目的是为了让系统内存不足,然后让系统将我们的app杀死)。当我们的app被系统杀死后,这时候通过任务管理点击我们的app进入应用。这时候问题出现了,app崩溃了,为了不暴露项目,一些项目包名或者类名的信息就用省略号显示了,下面就是异常的关键信息:java.lang.RuntimeExcept

xpleemoon 1万+

android修改配置或切换系统语言后的问题

Android修改配置重建时,fragment报错

左丘梦凡的博客 1674

Latex下使用JabRef添加参考文献

文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 Latex可以手动添加参考文献,但文献过多时,使用JabRef软件相对方便。 提示:以下是本篇文章正文内容,下面案例可供参考 一、JabRef安装 网址:http://www.jabref.org 打开网址后,点击“Download” 进入如下页面后,选择 portable (便携版,无需安装),下载后是一压缩包,打开即可使用。 二、使用 1.创建库 ...

sz3076799的博客 3470

fragment异常android.app.Fragment$InstantiationException: Unable to instantiate fragment

之前有遇到过一个异常,没在意,后期又不显示了,最近又出来了,后来百度了一下,找到一个不错的帖子。 构造函数异常: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.jsbd.news.NewsFragmentTitles: make sure class name exists

qq_16505961的博客 4550

扫地机器人:从仿真到决策,一个完整SLAM导航系统的自研之路

本文详细记录了从零开始自研扫地机器人SLAM导航系统的全过程,涵盖ROS-Gazebo仿真系统搭建、地图预处理优化、全覆盖规划算法迭代等关键技术。通过三次算法升级,最终实现92%的清洁效率,并分享DWA调参、状态机设计等实战经验,为开发者提供从仿真到落地的完整解决方案。

weixin_29053695的博客 352

GEE开发之Landsat8计算MNDWI和数据分析

上一篇博客介绍了landsat8计算NDWI以及数据的获取,这次介绍MNDWI(改进的归一化差异水体指数)。

等待着冬天的风的博客 8440

android.app.fragment instantiationexception,Fragment子类如果没有无参数构造器,可能导致某些情况下抛出异常InstantiationException...

碰到一个很难复现的crash,LogCat捕捉到如下crash信息:android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment MyFragment: make sure class name exists, is public, and has an empty constructo...

weixin_34357209的博客 429

保姆级教程:彻底清理Win11更新缓存并解除外设,一次搞定0xc1900101更新错误

本文提供了一套完整的Win11更新报错0xc1900101解决方案,涵盖软件环境净化和硬件设备隔离。通过终止干扰进程、重置更新组件、清理临时文件以及断开外设等步骤,有效提升更新成功率。特别强调外设驱动兼容性对解决0xc1900101错误的关键作用。

weixin_33483304的博客 420

Caused by: java.lang.InstantiationException: can't instantiate class报错记录

E/AndroidRuntime(15377): Caused by: java.lang.InstantiationException: can't instantiate class com.*.*.FriendsActivity; no empty constructor 在用fragment做跳转的时候出现的错误记录解决办法:是因为该Fragment没有使用空参的构造函数,补上-- p

huangrangg12的专栏 1万+

获取车辆VIN等OBD信息

获取车辆如下OBD信息: VIN:Vehicle Identification Number CALID:Calibration Identifications CVN:Calibration verification number 一、SAE J1939协议 通过请求 CALIBRATION INFORMATION (DM19),获取CVN和CALID。 发送请求:18EA00F9 00 D3 00 应答:18EC0000 10 14 00 03 FF 00 D3 00 数据,BYTE1=0x10,表明

jianxuezixuan的博客 1万+

前端Three.js面试题及参考答案

渲染循环(Render Loop)是 Three.js 中一个非常重要的概念,它是一个不断重复执行的过程,用于更新和渲染 3D 场景。在每次循环中,渲染循环会更新场景中的对象状态,如位置、旋转、缩放等,然后使用渲染器将更新后的场景渲染成 2D 图像显示在屏幕上。通过不断地重复这个过程,就可以实现动画效果。渲染循环的核心作用是确保场景能够实时更新,给用户带来流畅的视觉体验。如果没有渲染循环,场景将是静态的,不会有任何变化。只有通过不断地更新和渲染,才能让场景中的对象动起来,实现各种动画效果。

大模型大数据攻城狮的专栏 2723

java.lang.InstantiationException: class has no zero argument constructor

java.lang.InstantiationException: class has no zero argument constructor 需要在一个方法中的for循环中获取图片处理进度,在Fragment中显示。在该方法的for循环中采用发送广播的方法,在Fragment中接收进度数据进行显示。在Fragment类中声明了广播内部类。但是运行时出现上面问题。 解决方法如下: 1,如果

HelloWorld的专栏 4309

桌面运维工程师面试题详解(一)

桌面运维工程师面试题详解(一)

jks212454的博客 1428

java lang exception_java_lang_RuntimeException

问题分析:RuntimeException是运行时异常,是java编译器事先不可预见的异常。RuntimeException的子类众多,这里列举一些比较常见的子类:1.BufferOverflowException当相关 put 操作达到目标缓冲区限制时,抛出此未经检查的异常。2.ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。3.ArithmeticEx...

weixin_29061465的博客 2885

LVGL 丝滑菜单3(Silk Menu)

h。

摸鱼专家 92

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Activity被内存回收的思考1

手机开发者模式中有这样一个功能,不保留活动,打开以后跳转后,当前Activity会被系统回收,走onSaveInstanceState()方法保存activity的信息,返回时会重走生命周期,加上onRestoreInstanceState()方法。但是在调试的时候回报这样的java.lang.InstantiationException异常,意思是反射的时候不能不能实例化这个类,我找到了地方,就...

专栏 799

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android.app.fragment instantiationexception,Android InstantiationException With Fragment (It Is Publ...

问题I have a Fragment (it is not an inner class, and it does not have any constructor whatsoever)public class PreferenceListFragment extends ListFragment implements OnClickListenerI'm getting this crash...

weixin_39612720的博客 198

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

横竖屏切换引起的fragment恢复问题(InstantiationException)

横竖屏切换引起的fragment恢复问题 monkey测试时出现的问题log: AndroidRuntime: FATAL EXCEPTION: main AndroidRuntime: Process: com.android.settings, PID: 11889 AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.sett

weixin_44613278的博客 1539

Fragment恢复时注意事项:InstantiationException,别在Fragment写有参数的构造方法

最近使用Fragment时遇到的一个问题,记录下来。该问题出现的概率很小,也就是非必现。但是因为很多人也会这样使用Fragment,所以很可能你的项目中也隐藏着这样的一个bug,只是发生概率太小无法发现。问题主要跟Activity的数据恢复有关,其可能产生的Exception: android.support.v4.app.Fragment$InstantiationException: Unab

scnuxisan225的专栏 8887

java.lang.InstantiationException:no empty constructor解决方法

问题描述:定义一个MyFragment,明明有一个空的构造函数,却始终报java.lang.InstantiationException:no empty constructor错误 public class MyFragment extends Fragment { public MyFragment() { } @Override public View

3110

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment xxx.fragment

长时间没写博客了,今天就记录一下一个小问题吧!不知道大家有没有遇到这种问题,也就自己测试app的时候,没有什么bug,但是你长时间不管它,偶尔一天你心血来潮点了它一下,谁知道它是如此的不争气,闪退了。。。起初我忽略了这个问题,谁知道被客服查到了,因此今天我就来解决一下了。 异常如下所示: Unable to instantiate fragment xxx.fragement:make su...

迷茫的小亮仔的博客 2808

内存不足导致Fragment空白?从根因到解决方案全拆解

Android应用在内存紧张时,系统可能回收后台进程,导致页面重建后出现Fragment空白。理解内存回收机制与生命周期原理,是解决此类问题的关键。通过合理使用ViewModel持有数据、规范保存与恢复状态、优化图片加载与分页策略,可以显著提升应用在低内存环境下的稳定性。本文从实际工程出发,剖析Fragment空白的根因,并给出代码级的预防与修复方案,适用于列表页、图片密集型页面等常见场景。

weixin_33851604的博客 256

Android内存不足导致Fragment白屏?一文搞定排查与修复

在移动应用开发中,内存管理是决定应用稳定性的基石,尤其当系统可用内存不足时,后台Activity与Fragment会被主动回收,这是Android系统为保障前台进程流畅运行的机制。当Fragment被回收后重建,若业务数据未通过ViewModel或SavedState等可靠渠道持有,页面就会因数据缺失而渲染空白,形成用户感知的白屏故障。这类问题在低内存设备上高频发生,且难以在测试机复现,常表现为从后台切回时整页空白或内容区无数据。解决思路包括:用ViewModel持有跨生命周期数据、在onTrimMemor

weixin_34384557的博客 308

monetr API 完整参考:如何 3 步创建 API Key 并调用 REST API 快速入门

monetr 是一款专注于周期性支出(房租、订阅、账单)的开源预算记账应用。本文带你完整了解 monetr 的 **REST API**:如何通过 **API Keys** 用 Basic 认证调用接口、API 的核心约定(ID、时间、金额、分页),以及 Plaid 与 Stripe 两个 **Webhooks** 端点的工作原理,帮助新手把 monetr 数据接入自己的脚本与自动化工具。 [!

gitblog_00294的博客 480

android.support.v4.app.Fragment$InstantiationException解决方案

程序开发中遇到了android.support.v4.app.Fragment$InstantiationException这个bug,给出的提示是: make sure class name exists, is public, and has an empty constructor that is public。看了下自己写的代码,重写了一个带参数的构造参数用来new Fragment

Lewis的专栏 1976
上一篇: 关于viewpager常见的泄漏
下一篇: compose 二维码扫描qrcode
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值