gpt4 book ai didi

android - 同一 fragment 的多个实例 : Android Navigation Component

转载 作者:行者123 更新时间:2023-12-05 05:01:36 25 4
gpt4 key购买 nike

我创建了一个类来为我的应用程序中的每个选项卡处理不同的返回堆栈,因此我使用不同的导航 Controller 和“currentcontroller”字段来获取当前的导航 Controller :

   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 声明 fragment 两次,然后为各自的 id 声明不同的操作。我还尝试通过扩展原始的“AFragemnt”来制作“newsAFragment”和“formAFragment”,但仍然不起作用。

我也试过导航选项:

NavOptions.Builder().setLaunchSingleTop(false).build()

如何在导航图中使用同一 fragment 类的多个实例?

最佳答案

原来问题出在 ViewModel 而不是 fragment 本身。它使用了相同的 View 模型实例。相反,我知道为 viewmodelstore 中的每个实例使用唯一的 key

关于android - 同一 fragment 的多个实例 : Android Navigation Component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62649743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com