How to uncheck checked items in Navigation View?

前端 未结 12 1396
夕颜
夕颜 2020-12-15 15:48

I know it\'s possible to highlight a navigation view item by calling setCheckedItem() or return true value in onNavigationItemSelected to display t

相关标签:
12条回答
  • 2020-12-15 16:28

    i combine @arsent and @Rahul answers and write this code:

     private void NavigationView_NavigationItemSelected(object sender, NavigationView.NavigationItemSelectedEventArgs e)
            {
                var size = navigationView.Menu.Size();
                for (int i = 0; i < size; i++)
                {
                   var item= navigationView.Menu.GetItem(i).SetChecked(false);
                    if (item.HasSubMenu)
                    {
                        for (int j = 0; j < item.SubMenu.Size(); j++)
                        {
                            item.SubMenu.GetItem(j).SetChecked(false);
                        }
                    }
                }
                    e.MenuItem.SetChecked(true);
    
                drawerLayout.CloseDrawers();
    
            }
    

    above code is for xamarin c# and work,but u can easily convert to java

    0 讨论(0)
  • 2020-12-15 16:33

    @arsent's answer is correct but setCheckable(false) uncheck all items, it prevents the items from being checked in the future.

    Just use setChecked(false)

      int size = mNavigationView.getMenu().size();
    
        for (int i = 0; i < size; i++) {
            mNavigationView.getMenu().getItem(i).setChecked(false);
        }
    
    0 讨论(0)
  • 2020-12-15 16:35

    I guess someone like me use those methods just like this

    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.nav_today:
                break;
            case R.id.nav_calendar:
               navigationView.getMenu().performIdentifierAction(R.id.nav_today, 0);
               navigationView.getMenu().getItem(0).setChecked(true);//or
               navigationView.setCheckedItem(R.id.nav_today);//or
               drawerLayout.closeDrawers();
               break;
        }
        return true;
    }
    

    Trying to check R.id.nav_today after you clicked on R.id.nav_calendar, (btw: checkableBehavior="single"), unfortunately it will not work.

    That is because after your code navigationView.setCheckedItem(R.id.nav_today) be called then the R.id.nav_today will be checked immediately, but after this, your click on R.id.nav_calendar will check itself.

    That is why whatever methods you use seem never work at all. It is work, but be override immediately.

    0 讨论(0)
  • 2020-12-15 16:36

    Quoting @Codeversed, there is "no need to loop menu items with added overhead!". But, there is no need to create multiple groups (in this case he is creating the @+id/grp1 and @+id/grp2) to uncheck a previous checked item.

    You can simple add a single group for all elements with the android:checkableBehavior, like this:

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/id1"
            android:checked="true"
            android:icon="@drawable/drawable1"
            android:title="@string/string1" />
    
        <item
            android:id="@+id/id2"
            android:icon="@drawable/drawable2"
            android:title="@string/string2" />
    </group>
    

    0 讨论(0)
  • 2020-12-15 16:37

    All you need to do is surround your groups like this:

     <group>
        <group
            android:id="@+id/grp1">
            <item
                android:id="@+id/nav_profile"
                android:icon="@drawable/ic_account_circle_24dp"
                android:title="@string/profile" />
        </group>
        <group
            android:id="@+id/grp2">
            <item
                android:id="@+id/nav_settings"
                android:icon="@drawable/ic_settings_24dp"
                android:title="@string/settings" />
            <item
                android:id="@+id/nav_help"
                android:icon="@drawable/topic_help"
                android:title="@string/help_feedback" />
        </group>
    </group>
    

    No need to loop menu items with added overhead!

    0 讨论(0)
  • 2020-12-15 16:41

    I had to use a combination of all the solutions mentioned here. In my case, I want to open an URL Intent when the Item is clicked (open a Browser). The clicked item should get unchecked after the click and reset to the item before. Important is to understand, that you cannot uncheck an item during the click listener event, since the checked state will be handled afterwards. So this is my solution in Kotlin:

            val item = navigationView.menu.findItem(R.id.menu_item)
            item.setOnMenuItemClickListener {
    
                val oldItem = navigationView.checkedItem
                rootView.postDelayed({ // you can use here any View to post a Runnable with a delay
                    navigationView.setCheckedItem(oldItem?.itemId ?: R.id.default_item)
                }, 500)
                browseURL("https://www.example.com")
                true
            }
    

    I use a Navigation Drawer in combination with the Jetpack Navigation.

    0 讨论(0)
提交回复
热议问题