Lekcja 3.2. Dodawanie przycisków akcji

> Dodaj do ulubionych

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