Android 导航组件:查找片段是否在后堆栈中
我试图找到一个片段是否已经在我的NavHostFragment的backbackback中(因此它会自动管理片段事务和backbackback),以便在用户从我的侧菜单中选择目标时弹出到它,而不是向backbackback添加另一个新片段 这里有一个陷阱:我的许多片段都是同一个类,我们称之为Android 导航组件:查找片段是否在后堆栈中,android,android-fragments,android-architecture-navigation,Android,Android Fragments,Android Architecture Navigation,我试图找到一个片段是否已经在我的NavHostFragment的backbackback中(因此它会自动管理片段事务和backbackback),以便在用户从我的侧菜单中选择目标时弹出到它,而不是向backbackback添加另一个新片段 这里有一个陷阱:我的许多片段都是同一个类,我们称之为ArticleListFragment,它们的contentId参数(一个简单的字符串id)改变了这些片段中显示的内容 这意味着我不能使用nav\u host\u fragment.childFragment
ArticleListFragment
,它们的contentId
参数(一个简单的字符串id)改变了这些片段中显示的内容
这意味着我不能使用nav\u host\u fragment.childFragmentManager.findFragmentById()
,因为backstack中的多个片段具有相同的片段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
}
}
我做错什么了吗?有没有其他方法可以检查安卓导航组件添加的片段是否已经在后堆栈中?好吧,我也有同样的问题,我不能说这是一个完美的解决方案,但你可以通过
findNavController()
.backStack
.firstOrNull { it.destination.id == ID_YOU_WANT_TO_CHECK }
backstack
实际上受到限制,因此需要抑制该方法
@SuppressLint("RestrictedApi")
非常感谢。虽然使用受限方法不是一个好主意,但是NavigationComponent有很多限制,所以我愿意尝试任何方法。下次我做那个项目时,我会测试它。