我创建了一个类来为应用程序中的每个选项卡处理不同的后向堆栈,因此我在“ currentcontroller”字段中使用了不同的导航控制器来获取当前的:
private val navNewsController: NavController = obtainNavHostFragment(fragmentTag = "news", containerId = R.id.newsTabContainer).navController.apply {
graph = navInflater.inflate(R.navigation.navigation_graph_main).apply {
startDestination = startDestinations.getValue(R.id.tab_news)
}
addOnDestinationChangedListener { controller, destination, arguments ->
onDestinationChangedListener?.onDestinationChanged(controller, destination, arguments)
}
}
val navFormController: NavController = obtainNavHostFragment(fragmentTag = "form", containerId = R.id.formTabContainer).navController.apply {
graph = navInflater.inflate(R.navigation.navigation_graph_main).apply {
startDestination = startDestinations.getValue(R.id.tab_form)
}
addOnDestinationChangedListener { controller, destination, arguments ->
onDestinationChangedListener?.onDestinationChanged(controller, destination, arguments)
}
}
private fun obtainNavHostFragment(
fragmentTag: String,
containerId: Int
): NavHostFragment {
val existingFragment = mainActivity.supportFragmentManager.findFragmentByTag(fragmentTag) as NavHostFragment?
existingFragment?.let { return it }
val navHostFragment = NavHostFragment.create(R.navigation.navigation_graph_main)
mainActivity.supportFragmentManager.beginTransaction()
.add(containerId, navHostFragment, fragmentTag)
.commitNowAllowingStateLoss()
return navHostFragment
}
当我切换选项卡时,我只是更改了“ currentController”:
fun switchTab(tabId: Int, goToRoot: Boolean = false) {
currentFragment()?.onPause()
currentTabId = tabId
when (tabId) {
R.id.tab_news -> {
currentController = navNewsController
invisibleTabContainerExcept(newsTabContainer)
}
R.id.tab_form -> {
currentController = navFormController
invisibleTabContainerExcept(formTabContainer)
}
....
因此,我有从新闻和表格中打开的FragmentA。
每当我从新闻中打开FragmentA,然后从表单中打开FragmentA时,新闻中的FragmentA都会重新加载从表单中打开的新参数。
我尝试在导航图中使用不同的操作,尝试两次使用不同的ID声明该片段两次,然后对各个ID进行不同的操作。我还尝试通过扩展原始的“ AFragemnt”来制作“ newsAFragment”和“ formAFragment”,但仍然无法正常工作。
我还尝试了导航选项:
NavOptions.Builder().setLaunchSingleTop(false).build()
如何在导航图中使用同一片段类的多个实例?
答案 0 :(得分:1)
结果是问题出在ViewModel而不是片段本身。它使用的是视图模型的相同实例。相反,我知道对viewmodelstore中的每个实例使用唯一键