如何在一些已创建的片段中更改 defaultNavHost?
How to change the defaultNavHost among a few already created fragments?
我的 activity 中有几个片段,每个片段都有自己的 Navigation Graph
,它们是在创建 activity 时创建的。我想知道的是创建后如何选择它们中的任何一个作为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)
,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 或您可能想做的任何其他事情。
我的 activity 中有几个片段,每个片段都有自己的 Navigation Graph
,它们是在创建 activity 时创建的。我想知道的是创建后如何选择它们中的任何一个作为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)
,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 或您可能想做的任何其他事情。