Mam pasek akcji z menuitem. Jak mogę ukryć / pokazać ten element menu?
Oto co próbuję zrobić:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
android
android-actionbar
menuitem
android-menu
Mieszaj Zoltán
źródło
źródło
MenuItem
może byćnull
tak, ponieważ używaszgetItem
zamiastfindItem
. Nigdy nie moglibyśmy wiedzieć, nie widząc zarówno kodu, jak i dziennika awarii.onCreateOptionsMenu
i ustaw widoczność pozycji w tym momencie. Lub zachowaj referencję, dopóki nie zdecydujesz, czy powinna być widoczna, czy nie.invalidateOptionsMenu()
a następnie w środku,onCreateOptionsMenu(Menu)
uzyskaniu odniesienia doMenuItem
(przez wywołaniemenu.findItem()
) i wywołaniusetVisible()
go. Odpowiedzi suhas_sm i P1r4nh4 przedstawiają prawidłowe podejście.Znaleziono uzupełnienie do tego pytania:
Jeśli chcesz zmienić widoczność elementów menu w podróży, wystarczy ustawić zmienną członka w swojej aktywności, aby pamiętać, że chcesz ukryć menu i wywołać
invalidateOptionsMenu()
i ukryć elementy w przesłoniętejonCreateOptionsMenu(...)
metodzie.W moim przykładzie ukryłem wszystkie przedmioty.
źródło
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
Dokumenty mówią: „Musisz zwrócić wartość true, aby menu było wyświetlane; jeśli zwrócisz wartość false, nie zostanie wyświetlone”.onPrepareOptionsMenu()
powinien być używany do wyświetlania / ukrywania logiki zamiast,onCreateOptionsMenu()
ponieważ jest wywoływany tylko raz, więc nie jest użyteczny, jeśli chcesz zmienić elementy menu po jego inicjalizacji. Więc napompuj w onCreate, ale pokaż / ukryj w onPrepare.Tak.
invalidateOptionsMenu()
gdy chcesz ukryć opcję. To zadzwonionCreateOptionsMenu()
.onCreateOptionsMenu()
sprawdź flagę / warunek i pokaż lub ukryj ją w następujący sposób:źródło
invalidateOptionsMenu
zamiastinvalidateOptions
?onCreateOptionsMenu
Możesz to nazwać:
Aktualizacja:
Upewnij się, że kod nie zwraca
null
naitem
lub może ulec awarii aplikacji.źródło
Szukałem odpowiedzi w nieco szerszym kontekście. Teraz, gdy to rozgryzłem, dodam tę odpowiedź.
Ukryj przycisk domyślnie w menu xml
Domyślnie przycisk udostępniania będzie ukryty, zgodnie z ustawieniem
android:visible="false"
.main_menu.xml
Pokaż przycisk w kodzie
Ale przycisk udostępniania można opcjonalnie wyświetlić w zależności od pewnych warunków.
MainActivity.java
Zobacz też
źródło
invalidateOptionsMenu()
aby odświeżyć menu.nie działało dla mnie. Musiałem wyraźnie użyć,
onPrepareOptionsMenu
aby ustawić element niewidoczny.Więc użyj,
onCreateOptionsMenu
aby utworzyć menu ionPrepareOptionsMenu
zmienić widoczność itp.źródło
onPrepareOptionsMenu
wydaje się właściwym miejscem do wykonywania tego typu operacji: „Przygotuj standardowe menu opcji ekranu do wyświetlenia. Jest to wywoływane tuż przed wyświetleniem menu, za każdym razem, gdy jest wyświetlane. Możesz użyć tej metody, aby efektywnie włączać / wyłączać elementy lub w inny sposób dynamicznie modyfikować zawartość. ”invalidateOptionsMenu()
aby odświeżyć menu.Początkowo ustaw wartość widoczności elementu menu na wartość false w pliku układu menu w następujący sposób:
Następnie możesz po prostu ustawić widoczność elementu menu na wartość false w funkcji onCreateOptionsMenu () po napompowaniu menu.
źródło
Spróbuj tego:
źródło
To działało dla mnie zarówno z Aktywności, jak i Fragmentu
źródło
Odpowiedź P1r4nh4 działa dobrze, właśnie ją uprościłem, używając flagi boolean:
źródło
0
i1
nie jest „flagą logiczną”, jest pseudo-logiczną. poza tym nie ma powodu, aby używać tutaj rzeczywistej wartości logicznej.Według oficjalnej strony Android Developer, OnCreateOptionMenu (menu Menu) nie jest zalecane do zmiany pozycji menu lub ikon, widoczności .. itp. W Runtime.
Zgodnie z zaleceniami Możesz użyć tej metody onOptionsItemSelected (pozycja MenuItem) do śledzenia danych wejściowych użytkownika.
Jeśli chcesz zmienić pozycje menu w czasie wykonywania, możesz użyć onPrepareOptionsMenu (menu Menu), aby je zmienić
źródło
setVisible(false)
dla zawsze widocznego elementu, nie znika, dopóki nie kliknę trzech kropek (samo menu). Jeśli użyjęinvalidateOptionsMenu()
wonPrepareOptionsMenu
przedmiotach, natychmiast się reorganizuje, ale tracą one swoje działania (jeśli kliknę na dowolny element, nic nie robi).ustaw wartość zmiennej i wywołaj invalidateOptionsMenu ();
na przykład
źródło
setVisible(false)
dla zawsze widocznego elementu, nie znika, dopóki nie kliknę trzech kropek (samo menu). Jeśli użyjęinvalidateOptionsMenu()
wonPrepareOptionsMenu
przedmiotach, natychmiast się reorganizuje, ale tracą one swoje działania (jeśli kliknę na dowolny element, nic nie robi).Możesz użyć,
toolbar.getMenu().clear();
aby ukryć wszystkie elementy menu jednocześnieźródło
Po ustawieniu Widoczności wszystkich elementów w Menu, menu paska aplikacji lub menu przepełnienia będzie Ukrywać się automatycznie
Przykład
...
...
Przed przejściem do innego fragmentu użyj poniższego kodu:
źródło
https://stackoverflow.com/a/21215280/466363 - odpowiedzi: Look Alterno i Sufian
.
ActivityCompat.invalidateOptionsMenu () nie wywołuje wywołania zwrotnego onPrepareOptionsMenu (); po prostu aktualizuje menu bezpośrednio.
Moja someMethod () jest wywoływana z kilku miejsc, nawet przed onCreateOptionsMenu (), więc muszę sprawdzić mMenu! = Null.
źródło
Jeśli zrobiłeś wszystko jak w powyższych odpowiedziach, ale element menu jest nadal widoczny, sprawdź, czy odwołujesz się do unikalnego zasobu. Na przykład w onCreateOptionsMenu lub onPrepareOptionsMenu
Ctrl + kliknij R.id.menu_open i sprawdź, czy istnieje tylko w jednym pliku menu. W przypadku, gdy ten zasób jest już gdziekolwiek używany i załadowany w działaniu, spróbuje się tam ukryć.
źródło
Najlepszym sposobem na ukrycie wszystkich pozycji w menu za pomocą jednego polecenia jest użycie „grupy” w menu xml. Po prostu dodaj wszystkie elementy menu, które będą w twoim menu przepełnienia w tej samej grupie.
W tym przykładzie mamy dwa elementy menu, które zawsze będą wyświetlane (zwykły element i wyszukiwanie) oraz trzy elementy przepełnienia:
Następnie, w swojej aktywności (najlepiej w onCreateOptionsMenu), użyj polecenia setGroupVisible, aby ustawić widoczność wszystkich pozycji menu na false lub true.
Jeśli chcesz użyć tego polecenia w innym miejscu swojej aktywności, pamiętaj, aby zapisać klasę menu w lokalnym i zawsze sprawdź, czy menu jest puste, ponieważ możesz wykonać przed createOptionsMenu:
źródło
Dla osób korzystających z biblioteki Appcompat: Jeśli Twoje działanie podklasuje ActionBarActivity, możesz wywołać supportInvalidateOptionsMenu ()
Tutaj: https://stackoverflow.com/a/19649877/1562524
źródło
Myślę, że lepszym rozwiązaniem byłoby użycie zmiennej członka dla menu, zainicjowanie jej w onCreateOptionsMenu (), a następnie użycie setVisible () później, bez unieważniania menu opcji.
źródło
ten kod działał dla mnie
źródło
To podejście zadziałało dla mnie:
źródło
Próbujesz uzyskać dostęp do elementu menu z działania, które nie ma dostępu do zakresu. Wywołanie znalezienia elementu menu zwróci null , ponieważ widok nie jest powiązany ani z działaniem, ani z układem którego dzwonisz.
Elementy menu są powiązane z elementami takimi jak „ Pasek nawigacji ”, które z kolei są powiązane z odpowiednią aktywnością.
Więc zainicjuj te widoki w activity (), a następnie uzyskaj dostęp do elementów menu za pomocą tych widoków.
źródło
posługiwać się
invalidateOptionsMenu()
aby zadzwonić
onPrepareOptionsMenu(menu: Menu?)
https://developer.android.com/guide/topics/ui/menus
źródło
źródło