[英]How to manage Backstack with child fragments?
我对嵌套/子片段有疑问。 我的用例是:我将 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 的方法。
你的代码看起来不错。 只需在包含父片段的活动中覆盖onbackpressed
方法并将给定代码放入其中。
if (parentfragment.getChildFragmentManager().getBackStackEntryCount() > 1) {
parentfragment.getChildFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
现在可以使用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)
}
将标记传递到替换方法中。 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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.