如何在几个已经创建的片段中更改默认导航主机?



我的活动中有几个片段,每个片段都有自己的Navigation Graph,它们是在创建活动时创建的。我想知道的是,在创建它们后,我如何选择它们中的任何一个作为defaultNavHostPrimaryNavigationFragment

下面的代码创建它们并将它们设置为默认代码,但我不想每次都重新创建它们。我该怎么做?

val finalHost = NavHostFragment.create(navigation)
supportFragmentManager.beginTransaction()
.replace(R.id.navFragment0, finalHost)
.setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true"
.commit()

找不到执行我想要的操作的代码,因此这是我的解决方法:

首先从代码中的fragmentManager事务中删除#setPrimaryNavigationFragment(finalHost),和/或从 XML 的<fragment...>中删除app:defaultNavHost="true"

然后创建您的NavHostFragment并将它们中的每一个添加到HashMap

private val navHostFragments = HashMap<Int, NavHostFragment?>()
fun createNavHosts() {
val finalHost: NavHostFragment =
NavHostFragment.create(navigationId)
.also { navHostFragments[aHandleToTheNavHost] = it }
}

最后onBackPressed获取正确导航主机的navController并在其上导航:

override fun onBackPressed() {
if (navHostFragments[aHandleToTheNavHost]?.navController?.navigateUp() == false)
super.onBackPressed()
}

注意:#navigateUp()返回false时,这意味着无处可寻。因此,在那里您可以完成活动或您可能想做的任何其他事情。

最新更新