BackStack不使用嵌套片段

kit*_*ttu 2 android android-fragments

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

在ViewPager的第一页是FirstFragment,在按钮上单击我正在移动到FragmentA,然后在FragmentA中点击按钮我正在移动到FragmentB,它们在FragmentB中点击按钮,我正在移动到片段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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

kit*_*ttu 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();
}
Run Code Online (Sandbox Code Playgroud)