天天看點

fragment的知識和相關問題

1 添加傳回棧: addToBackStack(null)

public void replaceGoodDetailFragment() {
    getChildFragmentManager()
    .beginTransaction()
    .replace(R.id.fl_left, goodDetailFragment,"good")
    .addToBackStack(null)
    .commit();
}
           

2 退出傳回棧:

//這是一次性退出傳回棧中的所有fragment:
purchaseFragment.getChildFragmentManager().popBackStackImmediate(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);

//退出傳回棧最上面的frgament執行個體為:                purchaseFragment.getChildFragmentManager().popBackStackImmediate(null, 0);
           

3 fragment的嵌套

主要是在父類的fragment裡面調用 getChildFragmentManager()來獲得子類的管理者對象

getChildFragmentManager()
    .beginTransaction()
    .replace(R.id.fl_left, titleFragment)
    .commit();
           

4 frgament 嵌套出現的問題:

java.lang.IllegalStateException: Activity has been destroyed

at com.doimob.sysale.fragment.PurchaseFragment.replaceLeftFragment(PurchaseFragment.java:55)

04-28 17:19:44.921: E/AndroidRuntime(31605):

at com.doimob.sysale.fragment.PurchaseFragment.initData(PurchaseFragment.java:46)

04-28 17:19:44.921: E/AndroidRuntime(31605):

at com.doimob.sysale.fragment.BaseFragment.onActivityCreated(BaseFragment.java:41)

簡單來了解就是你嵌套的fragment雖然銷毀了,但是嵌套的fragment的管理者對象确沒有重置

是以就要在fragment的onAttach方法中

/**這是為了能夠讓子類的fragment管理者對象能夠重置掉*/
    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);
    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }