Kotlin修改NavigationView菜单项标题无效问题求助
问题根源与解决方案
对,你猜的完全没错!问题核心就是你一直在修改OptionsMenu的菜单实例,但实际显示的菜单属于NavigationView,两者根本不是同一个对象——这就好比你修改了A笔记本上的内容,却盯着B笔记本看,当然看不到变化啦,哪怕Toast能拿到修改后的标题,那也只是A笔记本里的内容而已。
正确的解决步骤:
直接操作NavigationView自己持有的菜单对象,而不是依赖onCreateOptionsMenu里的menuList:
- 获取NavigationView实例
先拿到你的NavigationView对象,比如通过findViewById:
val navView = findViewById<NavigationView>(R.id.oldsip)
- 定位到目标子菜单项
因为你的adres是嵌套在sipariscx的子菜单里的,所以得先找到父菜单项,再获取子菜单:
// 找到父菜单项 sipariscx val parentMenuItem = navView.menu.findItem(R.id.sipariscx) // 获取它的子菜单 val subMenu = parentMenuItem.subMenu // 找到目标子菜单项 adres val adresMenuItem = subMenu.findItem(R.id.adres)
- 修改标题并刷新NavigationView
修改标题后,调用NavigationView的invalidateMenu()方法让界面刷新:
adresMenuItem.setTitle("asdklzmfkldfvsas") // 刷新NavigationView,让修改生效 navView.invalidateMenu() // 验证修改结果 Toast.makeText(this, adresMenuItem.title.toString(), Toast.LENGTH_LONG).show()
为什么之前的方法无效?
你在onCreateOptionsMenu中保存的menuList是Android系统为Activity的OptionsMenu(比如顶部工具栏的菜单)创建的实例,而NavigationView的菜单是通过app:menu属性单独加载的独立Menu对象,两者没有任何关联,所以修改OptionsMenu的内容自然不会影响NavigationView的显示。
备选方案(如果invalidateMenu不生效)
如果调用invalidateMenu()后还是没变化,可以尝试重新加载菜单:
// 清空现有菜单,重新加载 navView.menu.clear() navView.inflateMenu(R.menu.gecmissiparis) // 重新定位菜单项并修改(重复步骤2和3)
内容的提问来源于stack exchange,提问作者Oğuz Kurukaya
相关产品推荐
相关产品推荐

