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内部的选中状态更新逻辑导致的:
- 当点击Sign out项时,系统会优先将Sign out设为选中状态,之后才会执行
onNavigationItemSelected回调里的代码。 - 场景2中,原本选中的就是Home项,此时调用
setChecked(true)设置Home为选中,NavigationView会判断“要选中的项和当前已选中的项是同一个”,于是跳过选中状态的更新流程,最终保留了Sign out的选中状态。 - 场景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
相关产品推荐
相关产品推荐

