2012-07-07 12 views
7

Miałem problem z ustawianiem niektórych elementów menu fragmentów w ActionBar i znalazłem sposób na jego rozwiązanie, ale nie rozumiem, dlaczego zadziałało.Używanie onPrepareOptionsMenu zamiast onCreateOptionsMenu w Fragment

Chciałem zmienić widoczność w elemencie menu zaraz po tym, jak nadmuchałem go z pliku menu xml w metodzie onCreateOptionsMenu. Kod wydaje się działać dobrze, ale nie ma widocznego efektu. Rozwiązałem problem zawyżając menu w metodzie onCreateOptionsMenu, ale zmieniając jego widoczność w metodzie onPrepareOptionsMenu.

Co chcę wiedzieć, dlaczego zmiana widoczności w onCreateOptionsMenu nie działa.

Co mogę zrobić w onPrepareOptionsMenu, którego nie mogę wykonać w onCreateOptionsMenu?

Czy istnieje wzór do naśladowania tutaj?

Dzięki!

Oto odpowiedni kod, na wszelki wypadek:

public class MyFragment extends Fragment { 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.my_menu, menu); 

     // This does not work, compiles and runs fine, but has no visible effect 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     // This does work 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 
} 
+1

Nie jestem pewien, ale [dokumentacja] (http://developer.android.com/reference/android/app/Activity. html # onCreateOptionsMenu (android.view.Menu)) mówi: "_ ... Aby zaktualizować menu za każdym razem, gdy jest wyświetlane, zobacz [onPrepareOptions Menu (Menu)] (http://developer.android.com/reference/android/app/ Activity.html # onPrepareOptionsMenu (android.view.Menu)) ._ " –

+1

Dzięki za komentarz! Chodzi o to, że nie muszę "aktualizować go za każdym razem, gdy jest wyświetlany" (jest wyświetlany cały czas, nie ma podmenu), chcę tylko skonfigurować menu tylko raz, po utworzeniu/nadmuchaniu i to wszystko . W porządku, może się wydawać, że to samo w mojej sytuacji, ale punktem mojego pytania jest zrozumienie, dlaczego tak działa. Dlaczego muszę "zmieniać konfigurację" menu za każdym razem, gdy jest ono wyświetlane, kiedy mogę to zrobić tylko raz, gdy go utworzę? –

+0

Rozumiem i zgadzam się, że powinna to być opcja. Moim zdaniem, myślę, że tak działa system Android. W niektórych przypadkach możesz kodować właściwości menu za pomocą atrybutów xml. –

Odpowiedz

5

Po utworzeniu menu należy zadzwonić pod numer super.onCreateOptionsMenu(menu, inflater);. To wysyła menu w górę w hierarchii i inne fragmenty lub aktywność może chcieć dodać elementy samodzielnie.

Aktywność jest odpowiedzialna za wyświetlanie i zarządzanie menu, więc jeśli zmienisz widoczność po wysłaniu do działania, nic się nie wydarzy.

Teraz, gdy zadzwonisz pod numer super.onPrepareOptionsMenu(menu);, "przygotuje" to menu, ale teraz uwzględni zmiany wprowadzone w onCreateOptionsMenu.

+1

nice - usuń tę linię, ponieważ masz rację "_ Myślę, że" " – Elltz

+0

Zrobione - dziękuję za comfirming. – Christian

0

Może być prawdziwy kod powinien powrócić do menu widoczne, co oznacza, że ​​należy umieścić return true; oświadczenie zarówno onCreateOptionsMenu() i onPrepareOptionsMenu().

Mam nadzieję, że to pomoże.

+5

onCreateOptionsMenu zwraca void – Axarydax

+1

Właściwie istnieje DWIE metody onPrepareOptions(). [Pierwszy] (http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu (android.view.Menu)), dla klasy Activity, zwraca wartość - jeśli prawda nie jest powrócił, menu nie będzie wyświetlane. Wersja [Fragment] (http://developer.android.com/reference/android/app/Fragment.html#onPrepareOptionsMenu (android.view.Menu)) nie działa. Wersja Fragment wymaga API 11 vs API 1 dla wersji Aktywności. Coś interesującego. – fattire

0

Używam menu onPrepareOptions do aktualizowania, które elementy w menu powinny być aktywne, a które powinny być wyszarzone/usuwane w zależności od bieżącego stanu aktywności. Użyj metody setVisible elementu menu, aby kontrolować, czy jest ona aktualnie wyświetlana w menu, czy nie.

-2

Działa to dla mnie

public class ContentFragment extends android.support.v4.app.Fragment { 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.content_frame,container,false); 
    setHasOptionsMenu(true); 
    return v; 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.note_menu,menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 
} 

Wypróbuj już

+0

Ta sprawa działa dla mnie, ale chcę wiedzieć, jak używać metody invalidateoptionsmenu() do dynamicznej zmiany –

+0

, jeśli jest jakikolwiek kod dotyczący dynamicznej aktualizacji menu, to plz daj mi znać. –

Powiązane problemy