底部导航的导航组件始终会创建新片段

时间:2019-02-26 08:58:34

标签: android kotlin android-architecture-navigation

单击底部导航项目时,是否可以使我的导航组件不创建新片段(而是使用现有片段)?

我只想使用导航组件。

binding.bottomNavBar.setOnNavigationItemSelectedListener {
        when (it.itemId) {
            R.id.currentWeatherFragment -> {
                navController.popBackStack(R.id.currentWeatherFragment, false)
                return@setOnNavigationItemSelectedListener true
            }

            R.id.futureListWeatherFragment -> {
                if (futureNumber > 0) {
                    Log.d("test", "popbackstack")
                    navController.popBackStack(R.id.futureListWeatherFragment, false)
                } else {
                    navController.navigate(navController.graph.findNode(R.id.futureListWeatherFragment)!!.id)
                    futureNumber++
                    Log.d("test", "navigate")
                }
                return@setOnNavigationItemSelectedListener true
            }

            R.id.settingsFragment -> {
                if (settingsNumber > 0) {
                    navController.popBackStack(R.id.settingsFragment, false)
                } else {
                    navController.navigate(navController.graph.findNode(R.id.settingsFragment)!!.id)
                    settingsNumber++
                }
                return@setOnNavigationItemSelectedListener true
            }

        }
        false
    }

1 个答案:

答案 0 :(得分:0)

恐怕暂时不可能。由于导航组件仍处于测试阶段,很遗憾,它缺乏适应所有情况的能力。

一种解决方案是将所有数据保留在视图模型中,并在每次navcontroller创建片段的新实例时使用此数据。这样,您可以保留已获取的数据。另外,您的业务逻辑将与UI逻辑分离,因此您的数据也可以在配置更改后幸免。

有关Viewmodels here

的更多信息