Dodawanie przycisków akcji
W tej lekcji
- Określanie akcji w pliku XML
- Dodawanie akcji do paska
- Reagowanie na przyciski akcji
- Przycisk „Do góry” w aktywnościach niskopoziomowych
Warto przeczytać
- Nawigacja do góry (ang.)
Do paska akcji można dodać przyciski, za pośrednictwem których możliwe jest wykonywanie najistotniejszych akcji w danym kontekście aplikacji. Akcje dostępne bezpośrednio oznaczone są ikoną i/lub tekstem — tak zwanymi przyciskami akcji. Te zaś, które nie mieszczą się na pasku lub nie są najistotniejsze, znajdują się w specjalnym ukrywanym menu (tzw. action overflow).

Rysunek 1. Pasek akcji z przyciskami wyszukiwania i ukrytego menu, po naciśnięciu którego dostępne są dodatkowe akcje
Określanie akcji w pliku XML
Wszystkie przyciski akcji i inne elementy dostępne w ukrywanym menu zdefiniowane są w pliku XML znajdującym się w zasobach menu. Aby dodać do paska akcje, musisz więc utworzyć nowy plik XML w katalogu res/menu/ projektu.
Dodaj element <item>
dla każdej pozycji, którą chcesz umieścić na pasku. Przykład:
res/menu/main_activity_actions.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- Wyszukiwanie ma być przyciskiem akcji --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" android:showAsAction="ifRoom" /> <!-- Ustawienia mają być zawsze ukryte --> <item android:id="@+id/action_settings" android:title="@string/action_settings" android:showAsAction="never" /> </menu>
Jeśli na pasku będzie wolne miejsce, przycisk wyszukiwania pojawi się bezpośrednio na nim, zaś ustawienia będą zawsze dostępne w ukrytym menu. (Domyślnie wszystkie akcje dodawane są do menu ukrytego, jednak dobrym zwyczajem jest określenie położenia każdej akcji).
Atrybutowi icon
należy przypisać identyfikator zasobu będącego obrazem. Do adresu @drawable/
musimy zatem dodać nazwę obrazu bitmapy zapisanego w katalogu res/drawable/ — przykładowo adres "@drawable/ik_pasek_wszukiwanie"
odnosi się do pliku ik_pasek_wyszukiwanie.png. W analogiczny sposób atrybut title
korzysta z zasobu łańcuchowego zdefiniowanego w pliku XML z katalogu res/values/. Omawialiśmy to już w lekcji Tworzenie prostego interfejsu użytkownika.
Jeśli jednak korzystasz w swojej aplikacji z biblioteki pomocniczej w celu uzyskania zgodności ze starszymi wersjami Androida, atrybut showAsAction
nie będzie dostępny w przestrzeni nazw android:
. Możesz natomiast skorzystać z niego za pośrednictwem biblioteki pomocniczej — musisz wówczas definiować własną przestrzeń nazw XML i użyć jej jako przedrostka atrybutu. (Twoja przestrzeń nazw XML powinna mieć związek z nazwą aplikacji, jednak możesz ją nazwać dowolnie. Będzie dostępna tylko w zakresie pliku, wewnątrz którego ją zadeklarujesz). Przykład:
res/menu/main_activity_actions.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" > <!-- Wyszukiwanie ma być przyciskiem akcji --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" yourapp:showAsAction="ifRoom" /> ... </menu>
Dodawanie akcji do paska
Aby umieścić na pasku akcji pozycje z menu, zaimplementuj w swojej aktywności metodę zwrotną onCreateOptionsMenu()
, w której dodasz za pomocą metody inflate()
wybrany element z zasobów menu do danego obiektu Menu
. Przykład:
>
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Dodaje pozycje menu do paska akcji za pomocą metody inflate
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
Reagowanie na przyciski akcji
Za każdym razem gdy użytkownik naciśnie któryś z przycisków akcji lub wybierze element znajdujący się w ukrytym menu, zostanie wywołana metoda zwrotna onOptionsItemSelected()
. W twojej implementacji na danym elemencie MenuItem
powinna być wywoływana metoda getItemId()
. Określisz w ten sposób, który element został wybrany — zwrócony identyfikator będzie odpowiadać wartości, jaką zadeklarowałeś dla atrybutu android:id
danego elementu <item>
.
@Override public boolean onOptionsItemSelected(MenuItem item) { // Obsługa naciśnięcia elementów paska akcji switch (item.getItemId()) { case R.id.action_search: openSearch(); return true; case R.id.action_settings: openSettings(); return true; default: return super.onOptionsItemSelected(item); } }
Przycisk „Do góry” w aktywnościach niskopoziomowych

Rysunek 4. Przycisk Do góry w poczcie Gmail
Wszystkie ekrany (aktywności), które nie stanowią głównego ekranu aplikacji powinny zawierać znajdujący się na pasku akcji przycisk Do góry — dzięki niemu użytkownik będzie mógł przejść do ekranu nadrzędnego aplikacji.
Jeśli korzystasz z Androida w wersji 4.1 (wersja 16 API) lub nowszego bądź obsługujesz pasek akcji za pomocą biblioteki pomocniczej, dodanie przycisku Do góry sprowadza się do zadeklarowania aktywności nadrzędnej w pliku manifestu i aktywowania przycisku Do góry dla paska akcji.
Oto przykładowa deklaracja aktywności nadrzędnej w manifeście:
<application ... > ... <!-- Główna aktywność (bez aktywności nadrzędnej) --> <activity android:name="com.example.myfirstapp.MainActivity" ...> ... </activity> <!-- Element potomny głównej aktywności --> <activity android:name="com.example.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- Metadane aktywności nadrzędnej dla obsługi Androida 4.0 i starszych --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application>
Następnie nadaj ikonie aplikacji funkcję przycisku Do góry poprzez wywołanie metody setDisplayHomeAsUpEnabled()
:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_displaymessage);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Jeśli najniższa obsługiwana wersja SDK ma numer 11 lub wyższy, wywołaj wówczas
// getActionBar().setDisplayHomeAsUpEnabled(true);
}
Teraz system wie, że MainActivity
jest rodzicem DisplayMessageActivity
, dzięki czemu po naciśnięciu przycisku Do góry użytkownik zostanie przeniesiony do odpowiedniej aktywności nadrzędnej — nie ma potrzeby obsługi zdarzenia naciśnięcia przycisku.
Więcej informacji na temat tego rodzaju nawigacji znajdziesz w artykule Nawigacja do góry.
Autor: Google
Źródło: https://developer.android.com/training/basics/actionbar/adding-buttons.html
Tłumaczenie: Joanna Liana
Treść tej strony jest dostępna na zasadach licencji CC BY 2.5