使用Fragment遇到的问题汇总

Fragment MediaFragment{a000d84} is not currently in the FragmentManager

onSaveInstanceState中直接FragmentManager.putFragment
有问题的使用:
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        if (mHomeFragment != null) {
            fm.putFragment(outState, HOME_FRAGMENT_KEY, mHomeFragment);
        }
		...
	}
报错:原因底部三个fragment,中间没有点击,所以没有add,在回收时候没有做判断
java.lang.IllegalStateException: Fragment MediaFragment{a000d84} is not currently in the FragmentManager
        at androidx.fragment.app.FragmentManagerImpl.putFragment(FragmentManager.java:923)
        at com.hj.fastframe.module.main.MainActivity.onSaveInstanceState(MainActivity.java:155)
        at android.app.Activity.performSaveInstanceState(Activity.java:1646)
        at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1508)
        at android.app.ActivityThread.callActivityOnSaveInstanceState(ActivityThread.java:5476)
        at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:4792)
        at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:4756)
        at android.app.ActivityThread.handleStopActivity(ActivityThread.java:4831)
        at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:41)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2155)
        at android.os.Handler.dispatchMessage(Handler.java:109)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:7539)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
解决办法:
if (mHomeFragment != null && mHomeFragment.isAdded()) {
            fm.putFragment(outState, HOME_FRAGMENT_KEY, mHomeFragment);
}

commit already called

每一个实例化后的 FragmentTransaction 的事物只能被提交一次
原来使用:
	初始化了一个全局ft
	多处ft...commit();
报错:原因事物只能被提交一次
commit already called
解决办法:
	每次都开启新的事务
	fm.beginTransaction().hide(frag).commit();

因内存不足等原因导致APP重启后Fragment重叠问题:Activity中onSaveInstanceState方法中保存fragment状态

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        if (mHomeFragment != null && mHomeFragment.isAdded()) {
            fm.putFragment(outState, HOME_FRAGMENT_KEY, mHomeFragment);
        }
        if (mMediaFragment != null && mMediaFragment.isAdded()) {
            fm.putFragment(outState, MEDIA_FRAGMENT_KEY, mMediaFragment);
        }
        if (mMineFragment != null && mMineFragment.isAdded()) {
            fm.putFragment(outState, MINE_FRAGMENT_KEY, mMineFragment);
        }
        outState.putInt(CURRENT_ITEM, selectedItem);

        super.onSaveInstanceState(outState);
    }

	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        llBottomBar = findViewById(R.id.ll_bottom_bar);
        ITEMS.add(new BottomTabBean(getString(R.string.icon_video), "首页"));
        ITEMS.add(new BottomTabBean(getString(R.string.icon_service), "消息"));
        ITEMS.add(new BottomTabBean(getString(R.string.icon_mine), "我的"));

        // 初始化碎片管理器
        fm = getSupportFragmentManager();

        if (savedInstanceState == null) {
            mHomeFragment = new HomeFragment();
            mMediaFragment = new MediaFragment();
            mMineFragment = new MineFragment();
        } else {
            selectedItem = savedInstanceState.getInt(CURRENT_ITEM, 0);
            mHomeFragment = (HomeFragment) fm.getFragment(savedInstanceState, HOME_FRAGMENT_KEY);
            mMediaFragment = (MediaFragment) fm.getFragment(savedInstanceState, MEDIA_FRAGMENT_KEY);
            mMineFragment = (MineFragment) fm.getFragment(savedInstanceState, MINE_FRAGMENT_KEY);
            if (mHomeFragment == null) {
                mHomeFragment = new HomeFragment();
            }
            if (mMediaFragment == null) {
                mMediaFragment = new MediaFragment();
            }
            if (mMineFragment == null) {
                mMineFragment = new MineFragment();
            }
        }
        ...
     }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值