2016-03-17 39 views

Odpowiedz

30

To odznacz wszystkie przedmioty

int size = mNavigationView.getMenu().size(); 
    for (int i = 0; i < size; i++) { 
     mNavigationView.getMenu().getItem(i).setChecked(false); 
    } 
+0

nie wiem po użyciu kodu to daje mi spację! – phpdroid

+1

w moim przypadku, po użyciu techniki, mam sprawdzony ostatni element i nie mogę go rozwiązać. Proszę, pomóż mi ... – takmilul

+0

@takmilul upewnij się, że używasz 'setChecked (false);' not' true' – arsent

19

Widziałem rozwiązanie @arsent i spróbowaliśmy, i to rzeczywiście to, co chcesz, co jest odznacz wszystkie elementy ... ale byłem mający problem w następujący scenariusz:

  1. Wybierz element menu 1 (przy użyciu NavigationView#setCheckedItem)
  2. odznacz wszystkie elementy, jak na użytkownika @ arsent rozwiązania
  3. Selec t menu 1 ponownie (przy użyciu NavigationView#setCheckedItem)

W tym scenariuszu pozycja 1 nie zostanie oznaczona jako zaznaczona. Dzieje się tak dlatego, że wewnętrznie widok nawigacyjny śledzi wcześniej wybrany element ustawiony w kroku 1, który nie zmienia się w kroku 2, i po prostu pomija krok 3, ponieważ poprzednio wybrany element jest taki sam jak ten, który teraz wybieramy.

Moja sugestia (i alternatywne rozwiązanie) w celu uniknięcia tego jest tylko o atrapę niewidoczny element i użyć NavigationView#setCheckedItem aby wybrać tę pozycję, gdy chcesz odznacz wszystko, tak jak

<item 
    android:id="@+id/menu_none" 
    android:title="" 
    android:visible="false"/> 

aby odznaczyć wszystko po prostu zrobić

mNavigationView.setCheckedItem(R.id.menu_none); 
1

Rozwiązania Joao nie zadziałały dla mnie tak, jak się tego spodziewano. Spowoduje to pozostawienie pustego miejsca w niezaznaczonym widoku elementu w mojej nawigacji.

Wystarczy upewnić się, aby ustawić widok jak poszedł:

<item 
    android:id="@+id/your_menu_item_id_to_hide" 
    android:title="" 
    android:visible="false"/> 


bottomNavigationView.getMenu().findItem(R.id.your_menu_item_id_to_hide).setChecked(true); 
    bottomNavigationView.findViewById(R.id.your_menu_item_id_to_hide).setVisibility(View.GONE); 

rozwiązanie Arsent nie jest konieczne w tym przypadku.

+0

Miałem ten sam problem i naprawiłem go, ale nie pamiętam jak teraz. Podwójne sprawdzanie parametrów xml w plikach układu –

+0

ah to dolny widok nawigacji, który jest ostatnio aktualny. Nigdy nie próbowałem swojego rozwiązania z tym komponentem, ale dobrze wiedzieć, że udało ci się go ulepszyć. –

12

Aby usunąć zaznaczenie wszystkich MenuItems tym SubMenu przedmioty trzeba użyć rekurencji -

private void unCheckAllMenuItems(@NonNull final Menu menu) { 
     int size = menu.size(); 
     for (int i = 0; i < size; i++) { 
      final MenuItem item = menu.getItem(i); 
      if(item.hasSubMenu()) { 
       // Un check sub menu items 
       unCheckAllMenuItems(item.getSubMenu()); 
      } else { 
       item.setChecked(false); 
      } 
     } 
    } 

połączenia powyższej metody odznaczając wszystkie przedmioty, jak poniżej -

unCheckAllMenuItems(navigationView.getMenu()); 
+2

warto przegłosować, jak wspomniano podmenu –

+1

Właściwa odpowiedź, – exshinigami

0

Wszystko, co musisz zrobić, to otoczyć Grupy takie jak ta:

<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> 

Nie trzeba t o elementy menu w pętli z dodanym narzutem!

0

Chyba ktoś taki jak ja stosować te same metody jak to

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; 
} 

Próbuje sprawdzić R.id.nav_today po kliknięciu na R.id.nav_calendar (btw: checkableBehavior="single"), niestety nie będzie działać.

To dlatego, że po wywołaniu kodu navigationView.setCheckedItem(R.id.nav_today), R.id.nav_today zostanie natychmiast sprawdzony, ale po tym kliknięcie na R.id.nav_calendar samo się sprawdzi.

Dlatego wszelkie metody, z których korzystasz, wydają się nigdy nie działać. To jest praca, ale natychmiast ją zastąp.

0

Cytując @Codeversed, istnieje "nie trzeba pętli elementów menu z dodanym obciążeniem!". Ale nie ma potrzeby tworzenia wielu grup (w tym przypadku tworzy on @+id/grp1 i @+id/grp2), aby odznaczyć poprzedni zaznaczony element.

Można prosty dodać jedną grupę dla wszystkich elementów z android:checkableBehavior coś takiego:

<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>