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).
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
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.