java.lang.IllegalStateException: Fragment already active

activity的onresume中

  Bundle bundleOffice = new Bundle();
  bundleOffice.putSerializable("officeMsg", officeMsg);
  mFragOffice.setArguments(bundleOffice);

setArguments报错:

   Caused by: java.lang.IllegalStateException: Fragment already active
                                              at android.support.v4.app.Fragment.setArguments(Fragment.java:551)
                                              at com.dch.dai.activity.featured.MessageActivity.onResume(MessageActivity.java:99)
                                              at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1279)
                                              at android.app.Activity.performResume(Activity.java:7017)
                                              at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3611)
                                              at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3676) 
                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1618) 
                                              at android.os.Handler.dispatchMessage(Handler.java:105) 
                                              at android.os.Looper.loop(Looper.java:156) 
                                              at android.app.ActivityThread.main(ActivityThread.java:6577) 
                                              at java.lang.reflect.Method.invoke(Native Method) 
                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941) 
                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831) 

我们先看下

setArguments源码:

 /**
     * Supply the construction arguments for this fragment.  This can only
     * be called before the fragment has been attached to its activity; that
     * is, you should call it immediately after constructing the fragment.  The
     * arguments supplied here will be retained across fragment destroy and
     * creation.
     * 已经添加过的fragment再次调用setArguments就会报错。只有第一次初始化的时候可调用。
     */    
    public void setArguments(Bundle args) {
        if(this.mIndex >= 0) {
            throw new IllegalStateException("Fragment already active");
        } else {
            this.mArguments = args;
        }
    }

分析:

java.lang.IllegalStateException: Fragment already active异常主要是使用setArguments()传递参数导致的。
在 Fragment 没有被添加到 FragmentManager 之前,我们可以通过 Fragment.setArguments() 来设置参数,并在 Fragment 中,使用 getArguments() 来取得参数。在 Fragment 被添加到 FragmentManager 后,一旦被使用,我们再次调用 setArguments() 将会导致 java.lang.IllegalStateException: Fragment already active 异常。

解决方法:

第一种:在fragment中添加一个全局变量设置setter和getter方法,在宿主activity通过setter与getter传递数据。

第二种:可以判断fragment只有在它第一次实例化时候传递参数。

第三种:判断fragment不等于null的时候将它置为空再次实例化它。

参考:关于Fragment使用中遇到的异常:Fragment already added和fragment not attached

异常:java.lang.IllegalStateException: Fragment already active

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值