无法在NavigationView

时间:2015-07-02 09:39:26

标签: android submenu navigationview

我试图在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"/>

如你所见:

enter image description here

然而,只要我改变我的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()功能?

1 个答案:

答案 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;
        }
    });

只需全局创建两个变量isBookCheckedisCdDVDChecked即可保持检查状态。

<强> [更新------------------- /////]

我花了一些时间来改变子项目的图标。 最后我做到了。但目前这是一个棘手的解决方案。 因为一个月前我报告了一个错误: 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 。我希望它对你有所帮助。