天天看点

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);
    }