最近維護的項目裏bugly中fragment報了幾種錯誤,記錄一下:
Fragment already active
出現場景:這是Fragment調用setArguments()方法時報的錯誤。
原因:當Android堆棧正在刪除Fragment而刪除操作沒有完成時,也就是Fragment仍保持active又被重新調用了setArguments()方法,常見操作是快速連續點擊調用這個Fragment的操作.。
解決方法:使用Fragment的isRemoving()方法來判斷該Fragment是否還存在堆棧中,如果true,那麼Fragment依然active,可以複寫相同地址下的Arguments來解決;如果false,那麼說明Fragment not active,可以直接調用setArguments()。
if (fragment.isRemoving()) {
fragment.getArguments().putAll(bundle);
} else {
fragment.setArguments(bundle);
}
如果是全局的dialogfragment,可以通過判斷fragment是否爲null來設置。
Fragment already added
出現場景: Fragment:快速雙擊調用FragmentTransaction.add()或者DialogFragment.show()方法添加fragment,而fragment不是每次單獨生成的,就會引起這個異常。
原因: fragment不是每次單獨生成的,就會引起這個異常;show()內部調用了FragmentTransaction.add()方法。
解決方法: Fragment:在add()方法時候,先判斷fragmentA.isAdded()
if(!fragmentA.isAdded()){
FragmentManager manager =getFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.add(fragment, "tag");
ft.commit();
}
DialogFragment:重寫show方法,根據tag來獲取fragment進行判斷:
@Override
public void show(FragmentManager manager, String tag) {
Fragment fragment = manager.findFragmentByTag(tag);
if (fragment == null || !fragment.isAdded()) {
super.show(manager, tag);
}
}
Fragment MyFragment not attached to Activity
出現該異常,是因爲Fragment的還沒有Attach到Activity時,調用瞭如getResource()等需要上下文Context的方法。
解決方法:
1.將調用的這些方法寫在OnStart()中。
2.在調用:getResources().getString(R.xx.xxx); 之前增加一個判斷isAdded();
Can not perform this action after onSaveInstanceSate
原因: 用戶在onSaveInstanceState期間操作了fragment,比如後退,切換操作等
解決辦法: commitAllowingStateLoss()去代替commit()