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