You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin Bottom Navigation Bar选中状态不更新问题求助

解决BottomNavigationView选中状态不更新的问题

你遇到的这个问题很常见——跳转Activity没问题,但对应的导航项就是不会自动高亮,对吧?核心原因是每个Activity都持有独立的BottomNavigationView实例,系统不会自动帮你同步选中状态,得咱们手动处理才行。

问题根源

你的代码里每次点击导航项都会直接启动新的Activity,但没有在每个Activity初始化时指定对应的选中项;另外,当用户已经在当前Activity时,重复启动实例既浪费资源,也会导致状态同步更混乱。

修复方案

咱们分两步来调整:

  1. 优化跳转逻辑,避免重复启动当前Activity
    在导航项选中监听里,先判断当前是不是已经在目标Activity里了,如果是的话直接返回true,不用执行跳转操作。

  2. 在每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:07