如何在一些已创建的片段中更改 defaultNavHost?

How to change the defaultNavHost among a few already created fragments?

我的 activity 中有几个片段,每个片段都有自己的 Navigation Graph,它们是在创建 activity 时创建的。我想知道的是创建后如何选择它们中的任何一个作为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),and/or 从 <fragment...> 在你的 XML.

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

private val navHostFragments = HashMap<Int, NavHostFragment?>()

fun createNavHosts() {
    val finalHost: NavHostFragment =
            NavHostFragment.create(navigationId)
            .also { navHostFragments[aHandleToTheNavHost] = it }
}

最后 onBackPressed 中获取正确的 navHost 的 navController 并向上导航:

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

注:#navigateUp()returnsfalse时,表示无处可导航。因此,您可以在那里完成 activity 或您可能想做的任何其他事情。