同一片段的多个实例:Android导航组件

时间:2020-06-30 03:17:21

标签: android android-architecture-navigation

我创建了一个类来为应用程序中的每个选项卡处理不同的后向堆栈,因此我在“ 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()

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

1 个答案:

答案 0 :(得分:1)

结果是问题出在ViewModel而不是片段本身。它使用的是视图模型的相同实例。相反,我知道对viewmodelstore中的每个实例使用唯一键