Wiem, że można podświetlić element widoku nawigacji dzwoniąc pod numer setCheckedItem()
lub zwrócić wartość true w onNavigationItemSelected
, aby wyświetlić element jako wybrany element, ale w jaki sposób odznaczać zaznaczone elementy widoku nawigacji?Odblokowywanie zaznaczonych elementów w widoku nawigacji?
Odpowiedz
To odznacz wszystkie przedmioty
int size = mNavigationView.getMenu().size();
for (int i = 0; i < size; i++) {
mNavigationView.getMenu().getItem(i).setChecked(false);
}
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:
- Wybierz element menu 1 (przy użyciu
NavigationView#setCheckedItem
) - odznacz wszystkie elementy, jak na użytkownika @ arsent rozwiązania
- 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);
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.
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 –
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ć. –
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());
warto przegłosować, jak wspomniano podmenu –
Właściwa odpowiedź, – exshinigami
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!
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.
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>
nie wiem po użyciu kodu to daje mi spację! – phpdroid
w moim przypadku, po użyciu techniki, mam sprawdzony ostatni element i nie mogę go rozwiązać. Proszę, pomóż mi ... – takmilul
@takmilul upewnij się, że używasz 'setChecked (false);' not' true' – arsent