我的活动中有几个片段,每个片段都有自己的Navigation Graph
,它们是在创建活动时创建的。我想知道的是,在创建它们后,我如何选择它们中的任何一个作为defaultNavHost
或PrimaryNavigationFragment
?
下面的代码创建它们并将它们设置为默认代码,但我不想每次都重新创建它们。我该怎么做?
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
时,这意味着无处可寻。因此,在那里您可以完成活动或您可能想做的任何其他事情。