底部导航视图片段已创建时重新创建

时间:2021-04-27 09:25:54

标签: android android-fragments fragmentmanager android-jetpack-navigation android-bottomnav

在我的应用程序中,我将 Jetpack NavigationBottomNavigationView 一起使用。我有 4 个片段:主页、搜索、通知、配置文件,当我在主页片段中时,我再次单击底部导航视图中的主页项目,它重新创建片段。我搜索过,但主要是针对那些不使用喷气背包导航的人的答案。

(顺便说一句,当我已经在那个片段中时,我只希望片段不被重新创建,如果我不在那个片段中,可以重新创建)

以下是我的设置:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView_mainActivity) as NavHostFragment
navController = navHostFragment.navController 
binding.bottomNavView.setupWithNavController(navController)

And this is the gif image that shows how bottom navigation view does behave

4 个答案:

答案 0 :(得分:0)

我阅读了 Google 的源代码。我看到了,它总是创建新的片段。

您有一个底部导航,就像我正在构建的应用程序一样。 :))

enter image description here

对我来说,我没有将菜单项用于底部导航视图。我为它添加了一个自定义视图。

(我有 MainActivity、MainViewModel 用于管理操作栏、底部导航视图。)

然后在自定义视图中,当客户单击项目时,我将检查他们要打开的页面是否与当前页面相同。如果它们相同,我不会打开它。像这样:

fun openHomePage() {
        if (pageID.value != R.id.nav_home) {
            pageID.postValue(R.id.nav_home)
        }
    }

pageID 存储当前页面的id:

 var pageID = MutableLiveData<Int>()
        private set

在主活动中:

mainViewModel.pageID.observe(this, Observer {
            val currentPageId = findNavController(R.id.nav_host_fragment).currentDestination?.id
            if (it != 0 && it != currentPageId) {
                drawerLayout.close()
                navigatePageWithId(it)
            }
        })

答案 1 :(得分:0)

这是一个已经存在一段时间的错误,谷歌没有提供官方的方法来处理它。更多信息是因为只有一个堆栈可以交换进出片段,您可以从 SO 的帖子中阅读更多信息

<块引用>

Android JetPack navigation with multiple stack

但是您使用的是 kotlin,您可以参考这个 Github 的 repo,他们为这种情况提供了解决方法

答案 2 :(得分:0)

我最终使用了下面的代码。(考虑到没有最好的解决方案,它对我有用) currentFragmentIndex 是在上述范围内声明的整数值,它显示了我们当前所在的片段。

binding.bottomNavView.setOnNavigationItemSelectedListener {
            when (it.itemId) {
                R.id.homeFragment -> {
                    if (currentFragmentIndex == 0) {
                        false
                    } else {
                        currentFragmentIndex = 0
                        navController.navigate(R.id.homeFragment)
                        true
                    }
                }
                R.id.searchFragment -> {
                    if (currentFragmentIndex == 1) {
                        false
                    } else {
                        currentFragmentIndex = 1
                        navController.navigate(R.id.searchFragment)
                        true
                    }
                }
                R.id.notificationsFragment -> {
                    if (currentFragmentIndex == 2) {
                        false
                    } else {
                        currentFragmentIndex = 2
                        navController.navigate(R.id.notificationsFragment)
                        true
                    }
                }
                R.id.myProfileFragment -> {
                    if (currentFragmentIndex == 3) {
                        false
                    } else {
                        currentFragmentIndex = 3
                        navController.navigate(R.id.myProfileFragment)
                        true
                    }
                }
                else -> false
            }

        }

答案 3 :(得分:0)

这是通过Jetpack Navigation

使用底部导航时防止碎片重新生成的正确方法
 binding.bottomNavView.setOnNavigationItemReselectedListener {
        // Do nothing to ignore the reselection
    }