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

NavigationView菜单项异常:原选中为最后一项时新项无法选中

问题场景

用户登录后菜单包含以下项:

  • Home
  • Sign out
  • Search

点击Sign out时预期自动选中Home项,但出现两种不一致的表现:

  • 场景1:选中Search后点击Sign out,Home项正常被选中
  • 场景2:选中Home后点击Sign out,Sign out项保持选中状态,未切换到Home

相关代码

protected void onCreate(Bundle savedInstanceState) {
    ...
    NavigationView navigationView = this.findViewById(R.id.navigation_view);
    navigationView.setNavigationItemSelectedListener(this);
    MainActivity.menu = navigationView.getMenu();
    ...
}

public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    int seleccion = item.getItemId();
    switch (seleccion) {
        ...
        case (R.id.menu_logout):
            MainActivity.menu.findItem(R.id.menu_inicio).setChecked(true);
            break;
        ...
    }
    ...
}

原因解析

这是NavigationView内部的选中状态更新逻辑导致的:

  1. 当点击Sign out项时,系统会优先将Sign out设为选中状态,之后才会执行onNavigationItemSelected回调里的代码。
  2. 场景2中,原本选中的就是Home项,此时调用setChecked(true)设置Home为选中,NavigationView会判断“要选中的项和当前已选中的项是同一个”,于是跳过选中状态的更新流程,最终保留了Sign out的选中状态。
  3. 场景1中原本选中的是Search,设置Home为选中时,和当前选中项不同,系统会正常执行更新,覆盖Sign out的临时选中状态。

解决方案

可以通过以下两种方式修复:

方案一:手动取消当前项选中后再设置Home

case (R.id.menu_logout):
    item.setChecked(false); // 先取消Sign out的选中状态
    MainActivity.menu.findItem(R.id.menu_inicio).setChecked(true);
    break;

方案二:延迟执行Home选中操作

利用post()让代码在系统完成Sign out的选中逻辑后再执行:

case (R.id.menu_logout):
    navigationView.post(() -> {
        MainActivity.menu.findItem(R.id.menu_inicio).setChecked(true);
    });
    break;

内容的提问来源于stack exchange,提问作者xerez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:32:40