如何使用子片段管理Backstack?

时间:2018-08-28 07:28:45

标签: android android-fragments android-nested-fragment child-fragment

我在嵌套/子片段方面遇到问题。我的用例是:我将Frag A作为父片段,并将FragChild1FragChild2FragChild3作为要在Frag A中显示的子片段。现在从FragChild3上按回它应该像:

  

FragChild3-> FragChild2-> FragChild1-> FragA(ParentFrag)。

我用来添加子片段的代码是-

for ChildFrag1-

Fragment mChildFragment1 = new ChildFragment1();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.replace(R.id.container_view, mChildFragment1);
        transaction.addToBackStack("FragChild1");
        transaction.commit();
        
for ChildFrag2-

Fragment mChildFragment2 = new ChildFragment2();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.replace(R.id.container_view, mChildFragment2);
        transaction.addToBackStack("FragChild2");
        transaction.commit();

我已经在StackOverflow中搜索了相关的答案,但是还没有找到管理子片段的Backstack的任何正确答案/方法。

4 个答案:

答案 0 :(得分:0)

将标记传递到replace方法中。 TAG可以和片段名称(字符串)一样简单。像这样更改代码:

transaction.replace(R.id.container_view, mChildFragment1, "FragChild1");
transaction.addToBackStack("FragChild1");
transaction.commit();

答案 1 :(得分:0)

尝试一下

Fragment fragment= new ChildFragment1();
getChildFragmentManager().beginTransaction().replace(R.id.contentView, fragment).addToBackStack(fragment.getClass().getName()).commitAllowingStateLoss();

答案 2 :(得分:0)

您的代码似乎不错。只需在包含父片段的活动中覆盖onbackpressed方法,然后在其中添加给定的代码即可。

if (parentfragment.getChildFragmentManager().getBackStackEntryCount() > 1) {
    parentfragment.getChildFragmentManager().popBackStackImmediate();
} else {
    super.onBackPressed();
}

答案 3 :(得分:0)

现在可以使用 OnBackPressedDispatcher 实现此行为,而无需覆盖 Activity 中的 onBackPressed

在您的父片段(您的片段容器所在的位置)中,在 onAttach 方法中添加以下代码:

override fun onAttach(context: Context) {
    super.onAttach(context)
    val backCallback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            // Remove all fragments from the childFragmentManager,
            // but exclude the first added child fragment.
            // This child fragment will be deleted with its parent.
            if (childFragmentManager.backStackEntryCount > 1) {
                childFragmentManager.popBackStack()
                return
            }
            // Delete parent fragment
            parentFragmentManager.popBackStack()
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(this, backCallback)
}

然后像这样在容器中添加片段:

childFragmentManager.commit {
    replace(R.id.fragmentContainerRoot, fragment)
    addToBackStack(null)
}