我试图在NavigationView
没有子项目(所有顶级菜单项)我可以使用以下代码愉快地更改图标:
mNavigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
Boolean boolObj = mMenuToggleMap.get(menuItem.getItemId());
boolean state = boolObj == null ? true : boolObj.booleanValue();
state = !state;
if(state) menuItem.setIcon(R.drawable.btn_check_off_holo_light);
else menuItem.setIcon(R.drawable.btn_check_on_holo_light);
mMenuToggleMap.put(menuItem.getItemId(), state);
return true;
}
});
menu.xml文件:
<item
android:id="@+id/books"
android:title="@string/books"
android:icon="@drawable/btn_check_off_holo_light"
app:showAsAction="always"/>
<item
android:id="@+id/cddvds"
android:icon="@drawable/btn_check_off_holo_light"
android:title="@string/cddvds"
app:showAsAction="always"/>
如你所见:
然而,只要我改变我的XML就这样:
<item
android:id="@+id/categorySubHeader"
android:title="@string/categories">
<menu>
<item
android:id="@+id/books"
android:title="@string/books"
android:icon="@drawable/btn_check_off_holo_light"
app:showAsAction="always"/>
<item
android:id="@+id/cddvds"
android:icon="@drawable/btn_check_off_holo_light"
android:title="@string/cddvds"
app:showAsAction="always"/>
我发现图标不再改变(即使仍在调用侦听器中的代码)。任何人都可以告诉我为什么这些项目没有更新?
我想知道是否可以在NavigationView上调用invalidateMenuOptions()
,或者可以在后备数据上调用notifyDataSetChanged()
功能?
答案 0 :(得分:1)
首先请确保您的这两个项目不应该是子项目。因为我也面临同样的问题,即更改子项目的图标无法正常工作。
所以你的XML应该是这样的。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="ng.edu.binghamuni.bhu.ui.activity.HomeActivity">
<item
android:id="@+id/books"
android:title="@string/books"
android:icon="@drawable/btn_check_off_holo_light"
app:showAsAction="always"/>
<item
android:id="@+id/cddvds"
android:icon="@drawable/btn_check_off_holo_light"
android:title="@string/cddvds"
app:showAsAction="always"/>
</menu>
在导航栏上,单击以下代码。
navView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.books:
menuItem.setIcon((isBookChecked)?R.drawable.btn_check_off_holo_light:R.drawable.btn_check_on_holo_light);
isBookChecked = !isBookChecked;
break;
case R.id.cddvds:
menuItem.setIcon((isCdDVDChecked)?R.drawable.btn_check_off_holo_light:R.drawable.btn_check_on_holo_light);
isCdDVDChecked = !isCdDVDChecked;
break;
}
return true;
}
});
只需全局创建两个变量isBookChecked
和isCdDVDChecked
即可保持检查状态。
<强> [更新------------------- /////] 强>
我花了一些时间来改变子项目的图标。 最后我做到了。但目前这是一个棘手的解决方案。 因为一个月前我报告了一个错误: https://code.google.com/p/android/issues/detail?id=176300,我们无法将动态菜单添加到导航视图。我认为这也是该错误的链条(更新UI问题)。
因此,对于解决方案,请在导航上执行以下操作,单击..
navView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// change the icon as you need
menuItem.setIcon(getResources().getDrawable(android.R.drawable.checkbox_on_background));
// here is the trick. Resetting the title of top level item.
navView.getMenu().getItem(0).setTitle(navView.getMenu().getItem(0).getTitle());
return true;
}
});
当我们使用setIcon()方法更改图标时。图标正在改变,但问题是它不会更新UI。 因此,重置顶级项目的标题将更新UI 。我希望它对你有所帮助。