Fragment報錯記錄

最近維護的項目裏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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章