带有DrawerLayout的NavigationView setCheckedItem无法正常工作

时间:2016-10-12 05:29:57

标签: android drawerlayout android-navigationview

我想让app NavigationView在应用启动时检查一项。但我发现NavigationView.setCheckedItem(R.id.xxx)无效。我也尝试了navigationView.getMenu().findItem(R.id.xxx).setChecked(true),结果相同。

我已经将checkableBehavior设置为单身。

<item android:title="@string/sliding_menu_group_places">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/xxx"
                    android:icon="@drawable/xxx"
                    android:title="@string/xxx" />

                <item
                    android:id="@+id/xxx"
                    android:icon="@drawable/xxx"
                    android:title="@string/xxx" />

                ...
            </group>
        </menu>
    </item>

但有一种方法可行:

drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            navigationView.setChecked(R.id.xxx);
        }

        @Override
        public void onDrawerClosed(View drawerView) {
        }

        @Override
        public void onDrawerStateChanged(int newState) {
        }
    });

将在onDrawerOpened回调中检查导航项。我在stackoverflow中搜索了很多,但没有一种方法适合我。谁可以帮我解决这个问题。

修改-1

<?xml version="1.0" encoding="utf-8"?>

<group android:checkableBehavior="single">
    <item
        android:id="@+id/xxx"
        android:icon="@drawable/xxx"
        android:title="@string/recent_display_name" />

    <item android:title="@string/sliding_menu_group_places">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/xxx"
                    android:icon="@drawable/xxx"
                    android:title="@string/my_files_display_name" />

                <item
                    android:id="@+id/nav_item_sdcard"
                    android:icon="@drawable/ic_nav_sdcard"
                    android:title="@string/storage_display_name" />
            </group>
        </menu>
    </item>

    <item android:title="@string/sliding_menu_group_tool">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/xxx"
                    android:icon="@drawable/xxx"
                    android:title="@string/clean_display_name" />
            </group>
        </menu>
    </item>

    <item android:title="@string/sliding_menu_group_settings">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/xxx"
                    android:icon="@drawable/xxx"
                    android:title="@string/settings_display_name" />

                <item
                    android:id="@+id/xxx"
                    android:icon="@drawable/xxx"
                    android:title="@string/exit_display_name" />
            </group>

        </menu>
    </item>
</group>

6 个答案:

答案 0 :(得分:4)

感谢@darwin。

<强>原因: navigationView.setCheckedItem(R.id.xxx)无效,因为NavigationView尚未准备就绪。

<强>解决方案:

navigationView.post(new Runnable() {
        @Override
        public void run() {
            navigationView.setCheckedItem(id);
        }
    });

答案 1 :(得分:1)

菜单项必须是可检查的。

<item android:title="@string/sliding_menu_group_places">
    <menu>
        <group> <!-- removed behavior -->
            <item
                android:id="@+id/xxx"
                android:icon="@drawable/xxx"
                android:title="@string/xxx"
                android:checkable="true" /> <!-- added 'checkable' -->

            <item
                android:id="@+id/xxx"
                android:icon="@drawable/xxx"
                android:title="@string/xxx"
                android:checkable="true" /> <!-- added 'checkable' -->

            ...
        </group>
    </menu>
</item>

答案 2 :(得分:0)

尝试这种方式:

 menuItem.setCheckable(true);
                menuItem.setChecked(true);
                if (mPreviousMenuItem != null && mPreviousMenuItem != menuItem) {
                    mPreviousMenuItem.setChecked(false);
                }
                mPreviousMenuItem = menuItem;

答案 3 :(得分:0)

下面的代码打开NavigationView的第一个片段并在NavigationView上检查它。对于 savedInstancesState == null 条件的含义:https://stackoverflow.com/a/26855936/4606368

    if (savedInstanceState == null) {
                Fragment fragment = new EventsUpcoming();
                getSupportFragmentManager().beginTransaction().replace(R.id.frame_container, fragment, "Upcoming").commit();
                navigationView.setCheckedItem(R.id.nav_eventupcoming);
                toolbar.setTitle(R.string.events_upcoming);
}

在活动的OnCreate方法中添加此代码。

答案 4 :(得分:0)

尝试使用itemChecked的这一行代码是所选菜单的索引

 navigationView.getMenu().getItem(itemChecked).setChecked(true);

答案 5 :(得分:-1)

使用项目的setChecked方法代替navigationView

navigationView.post(new Runnable() {
   @Override
   public void run() {
      navigationView.getMenu().getItem(0).setChecked(true);
   }
});