动态添加的Navigation Drawer Item选中后无法高亮问题求助
嘿,这个问题我之前也踩过坑!核心原因很简单:你动态添加的菜单项没有加入到XML里那个设置了android:checkableBehavior="single"的分组中——只有属于这个分组的菜单项,才能继承“单选+选中高亮”的行为。
具体解决步骤:
给XML中的单选分组添加ID(推荐)
先修改main_drawer.xml,给那个设置了单选行为的group加个明确的ID,方便后续代码直接获取:<group android:id="@+id/nav_checkable_group" android:checkableBehavior="single"> <item android:id="@+id/nav_home" android:icon="@drawable/ic_table_chart_black_24dp" android:title="@string/menu_topic_home" /> <item android:id="@+id/nav_plan" android:icon="@drawable/ic_table_chart_black_24dp" android:title="@string/menu_plan" /> </group>在代码中获取这个单选分组
拿到NavigationView的菜单后,直接通过ID找到这个分组:mNavigationView = findViewById(R.id.nav_view); Menu navigationMenu = mNavigationView.getMenu(); MenuGroup checkableGroup = navigationMenu.findGroup(R.id.nav_checkable_group);如果不想修改XML,也可以通过已有的菜单项间接获取分组:
MenuGroup checkableGroup = navigationMenu.findItem(R.id.nav_home).getGroup();将动态菜单项加入该分组
修改你动态添加菜单项的代码,把add()方法的第一个参数(分组ID)换成刚才获取的分组ID,而不是原来的0。另外建议用View.generateViewId()生成唯一的item ID,避免和现有菜单项ID冲突:for(int inx = 0; inx < myMenuItems.size() ; inx ++) { int uniqueItemId = View.generateViewId(); navigationMenu.add(checkableGroup.getId(), uniqueItemId, Menu.NONE, myMenuItems.get(inx)) .setIcon(R.drawable.ic_table_chart_black_24dp) .setOnMenuItemClickListener(this); }优化选中逻辑(可选)
因为分组已经设置了single的checkableBehavior,选中一个项时会自动取消其他项的选中状态,所以你的onMenuItemClick可以简化,还别忘了关闭抽屉:@Override public boolean onMenuItemClick(MenuItem item) { // 这里写你的Fragment切换逻辑 mNavigationView.setCheckedItem(item.getItemId()); // 关闭侧边抽屉 DrawerLayout drawer = findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; }
这样修改后,动态添加的菜单项就能和XML里的Home、Plan一样,选中时正常高亮啦!
内容的提问来源于stack exchange,提问作者SimpleGuy
相关产品推荐
相关产品推荐

