BackStack不使用嵌套片段

时间:2014-07-18 07:38:18

标签: android android-fragments

我使用ViewPager将三个页面显示为片段FirstFragment,SecondFragment,ThirdFragment:

在ViewPager的第一页是FirstFragment,在按钮上点击我移动到FragmentA,然后在FragmentA中点击按钮,我移动到FragmentB,它们在FragmentB中点击按钮,I& #39;移动到片段C. 现在,当我按回键时,我想按顺序进行: FragmentC,然后是FragmentB,然后是FragmentA,然后是FirstFragment(ViewPager第一页)

但是当我在FragmentC上按回键时,我就退出了应用程序:

然后我使用了以下解决方案

@Override
public void onBackPressed() {
    // if there is a fragment and the back stack of this fragment is not empty,
    // then emulate 'onBackPressed' behaviour, because in default, it is not working
    FragmentManager fm = getSupportFragmentManager();
    for (Fragment frag : fm.getFragments()) {
        if (frag.isVisible()) {
            FragmentManager childFm = frag.getChildFragmentManager();
            if (childFm.getBackStackEntryCount() > 0) {
                childFm.popBackStack();
                return;
            }
        }
    }
    super.onBackPressed();
}

上述解决方案仅在我有效时才有效 FirstFragment(ViewPager第一页)然后是FragmentA

但是在嵌套片段的情况下这不起作用: FirstFragment(ViewPager First Page)然后是FragmentA,然后是FragmentB,然后是FragmentC

1 个答案:

答案 0 :(得分:8)

我通过以下方式解决了这个问题:

在ViewPager FirstFragment中,为了添加第一个嵌套片段FragmentA,我使用了getChildFragmentManager。

但是在FragmentA中单击一下按钮,添加FragmentB,然后在FragmentB中点击一下按钮添加FragmentC,我使用了getSupportFragmentManager。

也按照onBackPressed方法使用:

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    for (Fragment frag : fm.getFragments()) {
        if (frag.isVisible()) {
            FragmentManager childFm = frag.getChildFragmentManager();
            if (childFm.getBackStackEntryCount() > 0) {
                for (Fragment childfragnested: childFm.getFragments()) {
                    FragmentManager childFmNestManager = childfragnested.getFragmentManager();
                    if(childfragnested.isVisible()) {
                        childFmNestManager.popBackStack();
                        return;
                    }
                }
            }
        }
    }
    super.onBackPressed();
}