poniedziałek, 10 lutego 2014

Konfiguracja własnego menu


Kod źródłowy do tej lekcji znajduje się tutaj. Rozpakuj go i zaimportuj. W katalogu z kodem źródłowym znajdą się podkatalogi oznaczone numerami. Są to po prostu kolejne wersje kodu, tworzonego w ramach przykładów. Możesz analizować kolejne kroki tworzenia aplikacji, lub od razu zabrać się za kod z katalogu o najwyższym numerku.

W większości urządzeń z Androidem (telefony, tablety) mamy dostępny przycisk menu. Warto byłoby oprogramować to co się dzieje po jego wciśnięciu. Możemy tam wstawić np. opcję wejścia w ustawienia programu, informacje o autorze, albo pomoc. Jeśli przyjrzymy się domyślnie automatycznie tworzonej klasie głównej aktywności, zobaczymy że zawiera ona metodę onCreateOptionsMenu:



W niej wskazywany jest plik zawierający opis zawartości menu. Powyższy (domyślny) wpis wskazuje na plik main.xml znajdujący się w katalogu menu będącym podkatalogiem katalogu res:


 
Możemy go przerobić pod własne potrzeby, lub stworzyć nowy i przerobić metodę onCreateOptionsMenu tak by wskazywała nowo stworzony. Domyślnie jego zawartość wygląda tak:


Mamy jedną opcję w menu, z napisem określonym w pliku strings.xml znajdującym się w katalogu res --> values pod nazwą „action_settings”. Przyglądamy się mu:

 
Widzimy, że napis na tej opcji w menu to „Settings”. Teraz zmienimy plik main.xml, by wprowadzić własne opcje menu. Nic nie stoi też na przeszkodzie bysmy stworzyli osobny plik, musimy jedynie pamiętać o zmianie ustawień w metodzie onCreateOptionsMenu aktywności. Do pliku strings.xml dodaję jeden wpis:


Dalej modyfikuję zawartość pliku main.xml wg własnych potrzeb:


 
Każdy element <item> to kolejna opcja w menu. Zrobiłem trzy elementy z napisami wpradzonymi bezpośrednio w tym pliku, a jeden z napisem pobieranym z pliku strings.xml Napis na opcji okresla parametr android:title. Parametr android:orderInCategory określa kolejność wyświetlania w menu od góry. Opcja android:id to identyfikator danej opcji w menu. Musimy zadbać o to by były one różne dla każdego elementu menu, inaczej nie będziemy później w stanie odróżnić która opcja została wybrana. Na ten moment menu po uruchomieniu wygląda tak:



Jeśli tak wolisz, nie musisz definiować zawartości menu w pliku XML. Możesz to zrobić bezpośrednio w kodzie Javy:


 
Metoda add dla obiektu klasy Menu (czyli naszego menu) wywoływana tutaj ma 4 parametry. Według kolejności: Numer grupy, numer elementu, kolejnośc wyświetlania, napis. Kod w działaniu:




Wracam jednak do starej metody z plikiem XML. Teraz dodamy obsługę kliknięcia. Dorzucam metodę onOptionsItemSelected która jest automatycznie wywoływana za każdym razem gdy użytkownik kliknie w menu. Przez parametr tej metody przekazywany jest obiekt elementu menu który został kliknięty. Mogę pobrać jego identyfikator, jednak nie będzie to identyfikator typu „opcja1” , „opcja2” czyli takie jak zdefiniowałem w pliku main.xml, a identyfikator liczbowy, który dopiero mogę porównać z identyfikatorami liczbowymi moich opcji menu. Tak to niestety trzeba na około robić:


W zależności od identyfikatora wyświetlam właściwy tekst. Wyświetlam też identyfikator liczbowy. Kliknąłem najpierw pierwszą opcję menu, potem trzecią. Tak wyglądają efekty:



10 komentarzy:

  1. gdzie to sie wyświetla że, kliknęliśmy?

    OdpowiedzUsuń
    Odpowiedzi
    1. [Ravano Beginner said,] Window > Show View > Other > Android > LogCat, możesz wyfiltrować np. po słowie "Opcja"

      Usuń
    2. ale można to sobie po prostu wrzucać do TextView i nie szukać w logu :)

      Usuń
  2. Hmm czemu mi na formatce nie wyświetla menu? trzeba nia niej umieścic jakiś komponent?

    OdpowiedzUsuń
  3. Co uzyskałeś dając 2 razy "orderoncategory=120" ? przypadkiem tak zostawiłeś i ostatni element miał mieć 130 ? czy jak dał bym każdemu order 100 to by wyszło tak samo jak bym dał 100 - 110 - 120-130 ?

    OdpowiedzUsuń
  4. pojawia mi się błąd przzy kompilacji "log cannot be resolved onOptionsItemSelected(MenuItem)" jak to naprawiC?

    OdpowiedzUsuń
    Odpowiedzi
    1. Kliknij SHIFT + CTRL + O żeby zaimportować biblioteki

      Usuń
  5. Bardzo fajny kurs, moje gratulacje.
    Niestety jest kilka błędów, np. w tej lekcji jest za dużo o jeden nawias klamrowy (zamykający w linii 38). To w sumie nic wielkiego ale potrafi trochę podnieść ciśnienie
    pozdrawiam

    OdpowiedzUsuń
  6. Czy jest możliwość obsłużyć opcje kliku w opcje menu dodając w atrybutach item :
    Android:onClik ?
    Próbowałem, ale mi to nie przechodzi.

    OdpowiedzUsuń