Fragment setArguments时的java.lang.IllegalStateException: Fragment already active异常主要是使用setArguments()传递参数导致的:
在 Fragment 没有被添加到 FragmentManager 之前,我们可以通过 Fragment.setArguments() 来设置参数,并在 Fragment 中,使用 getArguments() 来取得参数。在 Fragment 被添加到 FragmentManager 后,一旦被使用,我们再次调用 setArguments() 将会导致 java.lang.IllegalStateException: Fragment already active 异常。
解决办法:想要在Fragment已经加载过了之后重新改变调用传递新的参数来刷新Fragment:可以重写Fragment的onHiddenChanged(boolean hidden)方法,当hidden返回false时重新获取Arguments:
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
updateOnDataChanged();
}
}
private void updateOnDataChanged(){
Bundle bundle = getArguments();
if (bundle!=null){
year = bundle.getInt("YEAR");
month = bundle.getInt("MONTH");
Log.d(TAG, "updateOnDataChanged YEAR:"+year+"---MONTH:"+month);
mAdapter.updateData(getData());
}
}
另外,在需要传递参数的地方可以这样判断是否加载过Fragment:
FragmentTransaction transaction = mFm.beginTransaction();
if (mWeekFragment == null) {
// 这里会进入Fragment的OnCreate方法
mWeekFragment = new WeekFuelFragment();
Bundle bundle = new Bundle();
bundle.putInt("YEAR", year);
bundle.putInt("MONTH", (month+1));
mWeekFragment.setArguments(bundle);
transaction.add(R.id.cotent_view, mWeekFragment);
} else {
// 这里会进入Fragment的onHiddenChanged方法
Bundle bundle = new Bundle();
bundle.putInt("YEAR", year);
bundle.putInt("MONTH", (month+1));
// 重新传递新的参数
mWeekFragment.getArguments().clear();
mWeekFragment.getArguments().putAll(bundle);
transaction.show(mWeekFragment);
}
transaction.commit();