3

我遇到了嵌套/子片段的问题。我的用例是:我将 Frag A 作为父片段FragChild1,将FragChild2,FragChild3作为子片段显示在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

4 回答 4

3

你的代码看起来不错。只需覆盖onbackpressed包含父片段的活动中的方法并将给定的代码放入其中。

if (parentfragment.getChildFragmentManager().getBackStackEntryCount() > 1) {
    parentfragment.getChildFragmentManager().popBackStackImmediate();
} else {
    super.onBackPressed();
}
于 2018-08-28T10:06:14.610 回答
0

将标签传递给 replace 方法。TAG 可以像片段名称(String)一样简单。像这样更改您的代码:

transaction.replace(R.id.container_view, mChildFragment1, "FragChild1");
transaction.addToBackStack("FragChild1");
transaction.commit();
于 2018-08-28T07:38:15.640 回答
0

尝试这个,

Fragment fragment= new ChildFragment1();
getChildFragmentManager().beginTransaction().replace(R.id.contentView, fragment).addToBackStack(fragment.getClass().getName()).commitAllowingStateLoss();
于 2018-08-28T07:44:25.693 回答
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)
}
于 2021-07-08T15:51:35.470 回答