java.lang.IllegalStateException Can not perform this action after onSaveInstanceState

本文探讨了在使用Fragment或DialogFragment时可能遇到的IllegalStateException错误,并提供了详细的解决方案,包括如何正确使用commitAllowingStateLoss()和dismissAllowingStateLoss()等方法。

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

fragment或者dialogFragment show或者dismiss可能出现这个错误. 因为在onSaveInstanceState之后调用了commit

解决方法

onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后再给它添加Fragment就会出错。解决办法就是把commit()方法替换成 commitAllowingStateLoss(), dialogFragment需要将dismiss换成dismissAllowingStateLoss. 表示允许状态丢失.

一般只在可能出现这种问题的时候这么做. 如果确定不会在其它线程show fragment的话使用普通的commit就好

捕获异常不操作, 解决方法其实有很多,可以上Stack Overflow搜一搜

@Override  
   public void show(FragmentManager manager, String tag) {  
       try {  
           super.show(manager, tag);  
       } catch (IllegalStateException ignore) {  
           //  
       }  
   }

当dialogFragment的依附的activity已经关闭了的时候,不能再调用dismissAllowingStateLoss或dismiss之类的函数.
会抛如下错误:

Caused by: java.lang.IllegalStateException: Activity has been destroyed
android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1458)
android.app.BackStackRecord.commitInternal(BackStackRecord.java:708)
android.app.BackStackRecord.commit(BackStackRecord.java:672)
android.app.DialogFragment.show(DialogFragment.java:230)

解决方法, 重写一下dismiss 判断一个activity是否正在结束

    @Override
    public void dismissAllowingStateLoss() {
        if (!getActivity().isFinishing())
        super.dismissAllowingStateLoss();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值