已创建时重新创建底部导航视图片段
bottom navigation view fragment re-created when it is already created
在我的应用程序中,我使用 Jetpack Navigation 和 BottomNavigationView
。我喜欢 4 fragments:Home、搜索、通知、配置文件,当我在主页片段中时,我再次单击底部导航视图中的主页项目,它 重新创建 片段。我搜索了一下,但主要是针对那些没有使用 jetpack 导航的人。
(顺便说一句,我只希望当我已经在那个片段上时不重新创建片段,如果我不在那个片段中,重新创建是可以的)
以下是我的设置:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView_mainActivity) as NavHostFragment
navController = navHostFragment.navController
binding.bottomNavView.setupWithNavController(navController)
我阅读了Google的源代码。我看到了,它总是创建新的片段。
你有一个底部导航,就像我正在构建的应用程序一样。 :))
对我来说,我没有使用底部导航视图的菜单项。我为它添加了自定义视图。
(我有 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
在 MainActivity 中:
mainViewModel.pageID.observe(this, Observer {
val currentPageId = findNavController(R.id.nav_host_fragment).currentDestination?.id
if (it != 0 && it != currentPageId) {
drawerLayout.close()
navigatePageWithId(it)
}
})
这是一个已经存在了一段时间的错误,Google 还没有提供官方的处理方法。更多信息是因为只有一个堆栈换入和换出片段,您可以从 SO 的 post
中阅读更多信息
Android JetPack navigation with multiple stack
但是您使用的是 kotlin,您可以参考此 Github 的 repo,他们在其中提供了针对这种情况的解决方法
我最终使用了下面的代码。(考虑到没有最好的解决方案,它对我有用)
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
}
}
这是通过 Jetpack Navigation
使用底部导航时防止重新创建片段的正确方法
binding.bottomNavView.setOnNavigationItemReselectedListener {
// Do nothing to ignore the reselection
}
在我的应用程序中,我使用 Jetpack Navigation 和 BottomNavigationView
。我喜欢 4 fragments:Home、搜索、通知、配置文件,当我在主页片段中时,我再次单击底部导航视图中的主页项目,它 重新创建 片段。我搜索了一下,但主要是针对那些没有使用 jetpack 导航的人。
(顺便说一句,我只希望当我已经在那个片段上时不重新创建片段,如果我不在那个片段中,重新创建是可以的)
以下是我的设置:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView_mainActivity) as NavHostFragment
navController = navHostFragment.navController
binding.bottomNavView.setupWithNavController(navController)
我阅读了Google的源代码。我看到了,它总是创建新的片段。
你有一个底部导航,就像我正在构建的应用程序一样。 :))
对我来说,我没有使用底部导航视图的菜单项。我为它添加了自定义视图。
(我有 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
在 MainActivity 中:
mainViewModel.pageID.observe(this, Observer {
val currentPageId = findNavController(R.id.nav_host_fragment).currentDestination?.id
if (it != 0 && it != currentPageId) {
drawerLayout.close()
navigatePageWithId(it)
}
})
这是一个已经存在了一段时间的错误,Google 还没有提供官方的处理方法。更多信息是因为只有一个堆栈换入和换出片段,您可以从 SO 的 post
中阅读更多信息Android JetPack navigation with multiple stack
但是您使用的是 kotlin,您可以参考此 Github 的 repo,他们在其中提供了针对这种情况的解决方法
我最终使用了下面的代码。(考虑到没有最好的解决方案,它对我有用)
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
}
}
这是通过 Jetpack Navigation
使用底部导航时防止重新创建片段的正确方法 binding.bottomNavView.setOnNavigationItemReselectedListener {
// Do nothing to ignore the reselection
}