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