我试图查找NavHostFragment的backStack中是否已经有一个片段(因此它会自动管理片段事务和backstack),以便当用户从我的侧边菜单中选择该目的地时弹出该片段,而不是向后堆栈中添加另一个新片段。
这很重要:我的许多片段都属于同一类,我们将其称为ArticleListFragment
,它们的contentId
参数(简单的字符串ID)会更改这些片段中显示的内容。>
这意味着我无法使用nav_host_fragment.childFragmentManager.findFragmentById()
,因为我在后堆栈中的多个片段具有相同的片段ID。
到目前为止,我尝试过的是
var foundIndex = -1
for (i in 0 until nav_host_fragment.childFragmentManager.backStackEntryCount) {
val currFragmentTag = nav_host_fragment.childFragmentManager.getBackStackEntryAt(i).name
val currFragmentId = nav_host_fragment.childFragmentManager.getBackStackEntryAt(i).id
//val currFragment = nav_host_fragment.childFragmentManager.findFragmentByTag(currFragmentTag) // always returns null
val currFragment = nav_host_fragment.childFragmentManager.findFragmentById(currFragmentId) // always returns null
// currentFragment is null so the check always fails
if (currFragment is ArticleListFragment && currFragment.contentId == "a value I need to check") {
foundIndex = i
break
}
}
我做错什么了吗?是否有另一种方法可以检查由Android导航组件添加的片段是否已经在后堆栈中?
答案 0 :(得分:1)
嗯,我遇到了同样的问题,我不能说这是一个完美的解决方案,但是您可以通过
findNavController()
.backStack
.firstOrNull { it.destination.id == ID_YOU_WANT_TO_CHECK }
backstack
实际上是受限制的,因此需要禁止该方法。
@SuppressLint("RestrictedApi")