Android "Unable to instantiate fragment"解决方案

本文针对Fragment在项目中引发的RT问题进行深入分析,探讨了Fragment重构失败的具体原因,并提供了有效的解决方案。

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

但凡项目中有用到Fragment的,基本上都会遇到RT问题。笔者在网上查了很多相关资料,都没有发现对出现这个问题的原因进行深入分析的。所以打算在本文结合源码来分析下这个问题的产生,并提供解决方案。下面进入正题,直接上报错信息:

Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.ckjr.context.VoteActivity$VoteFragment: make sure class name exists, is public, and has an empty constructor that is public


可以看到是初始化fragment失败。第一反应:禁止系统修改导致的Activity销毁重建,于是在Androidmanifest.xml加上如下代码:


然而并没有太大软用,在手机上运行一段时间后,内存不够,应用被回收掉。再次进入依然需要重新创建,crash。

其实原因很简单。当切换到其他应用时,会调用FragmentActivity的onSaveInstanceState方法,再次进入,Activity重新创建,onCreate方法中会拿到savedInstanceState并re-instantiate。

我们先进入onSaveInstanceState():

/**
     * Save all appropriate fragment state.
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Parcelable p = mFragments.saveAllState();
        if (p != null) {
            outState.putParcelable(FRAGMENTS_TAG, p);
        }
    }
Parcelable saveAllState() {
        .......
   FragmentManagerState fms = new FragmentManagerState();
        fms.mActive = active;
        fms.mAdded = added;
        fms.mBackStack = backStack;
        return fms;
    }
非常简单,将Fragment的状态保存到outState,而outState就是onCreate方法中的savedInstanceState。fms.Added,是一个数组,每当调用addFragment或attachFragment就会往里添加;fms.Active,在addFragment()中调用makeActive()将Fragment往其中添加;fms.mBackStack,Fragment栈,用
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值