我在嵌套/子片段方面遇到问题。我的用例是:我将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的任何正确答案/方法。
答案 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)
}