如何使用子片段管理反向堆栈?



我在嵌套/子片段方面遇到问题。我的用例是:我将碎片 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 搜索了相关答案,但尚未找到任何正确的答案/方法来管理子片段的反向堆栈。

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

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

现在可以使用 OnBackPressedDispatcher 实现此行为,而无需覆盖活动中的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)
}

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

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

试试这个,

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

最新更新