Android Kotlin Bottom Navigation Bar选中状态不更新问题求助
你遇到的这个问题很常见——跳转Activity没问题,但对应的导航项就是不会自动高亮,对吧?核心原因是每个Activity都持有独立的BottomNavigationView实例,系统不会自动帮你同步选中状态,得咱们手动处理才行。
问题根源
你的代码里每次点击导航项都会直接启动新的Activity,但没有在每个Activity初始化时指定对应的选中项;另外,当用户已经在当前Activity时,重复启动实例既浪费资源,也会导致状态同步更混乱。
修复方案
咱们分两步来调整:
优化跳转逻辑,避免重复启动当前Activity
在导航项选中监听里,先判断当前是不是已经在目标Activity里了,如果是的话直接返回true,不用执行跳转操作。在每个Activity的
onCreate中主动设置选中项
当Activity创建完成后,调用setSelectedItemId方法,把对应的导航项设为选中状态。
修改后的示例代码(以GrammaireActivity为例)
import android.content.Intent import android.os.Bundle import android.support.design.widget.BottomNavigationView import android.support.v7.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_grammaire.* class GrammaireActivity : AppCompatActivity() { private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item -> when (item.itemId) { R.id.navigation_grammaire -> { // 已经在当前Activity,无需跳转 return@OnNavigationItemSelectedListener true } R.id.navigation_situations -> { val intent = Intent(this, SituationsActivity::class.java) startActivity(intent) return@OnNavigationItemSelectedListener true } R.id.navigation_lexiquefrsa -> { val intent = Intent(this, LexiqueFrSaActivity::class.java) startActivity(intent) return@OnNavigationItemSelectedListener true } R.id.navigation_lexiquesafr -> { val intent = Intent(this, LexiqueSaFrActivity::class.java) startActivity(intent) return@OnNavigationItemSelectedListener true } R.id.navigation_infos -> { val intent = Intent(this, InfosActivity::class.java) startActivity(intent) return@OnNavigationItemSelectedListener true } } false } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_grammaire) navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener) // 关键:设置当前Activity对应的导航项为选中状态 navigation.setSelectedItemId(R.id.navigation_grammaire) } }
其他Activity的同步处理
你需要给另外四个Activity(SituationsActivity、LexiqueFrSaActivity等)做同样的修改:
- 在各自的
onCreate方法里,调用navigation.setSelectedItemId(R.id.对应的导航项ID) - 在导航监听逻辑中,对当前Activity对应的itemId直接返回
true,不执行跳转
这样修改后,每个Activity启动时都会自动高亮对应的导航项,还能避免重复创建相同Activity的实例,使用体验会流畅很多。
内容的提问来源于stack exchange,提问作者mbrd
相关产品推荐
相关产品推荐

