Lekcja 2.4. Uruchamianie nowej aktywności

> Dodaj do ulubionych

W tej lekcji:

  1. Reagowanie na zdarzenia naciśnięcia przycisku
  2. Budowanie intencji
  3. Uruchamianie drugiej aktywności
  4. Tworzenie drugiej aktywności
  5. Odbieranie intencji
  6. Wyświetlanie wiadomości

Do przeczytania:

Po ukończeniu poprzedniej lekcji masz aplikację wyświetlającą aktywność (pojedynczy ekran) zawierającą pole tekstowe i przycisk. W tej lekcji napiszesz kod do aktywności MainActivity, który będzie uruchamiał nową aktywność w reakcji na zdarzenie kliknięcia przez użytkownika przycisku Wyślij.

Reagowanie na zdarzenia naciśnięcia przycisku

Aby zdefiniować procedurę obsługi zdarzenia kliknięcia przycisku, otwórz plik układu activity_main.xml i dopisz elementowi <Button> atrybut android:onClick:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

Wartość sendMessage atrybutu android:onClick jest nazwą metody w naszej aktywności, która będzie wywoływana przez system w odpowiedzi na kliknięcie przycisku przez użytkownika.

Otwórz klasę MainActivity i dodaj do niej odpowiednią metodę:

/** Wywoływana, gdy użytkownik kliknie przycisk Wyślij */
public void sendMessage(View view) {
    // Kod wykonywany w odpowiedzi na kliknięcie przycisku
}

Aby system powiązał tę metodę z nazwą podaną w atrybucie android:onClick, sygnatura tej metody musi być dokładnie taka, jak pokazana. W szczególności metoda musi:

  • być publiczna,
  • mieć wartość zwrotną typu void,
  • przyjmować tylko jeden parametr View (będzie to widok [View], który został kliknięty).

W następnym podrozdziale napiszemy kod odczytujący zawartość pola tekstowego i przekazujący go do innej aktywności.

Budowanie intencji

Intencja (Intent) to obiekt wiążący różne elementy (np. dwie aktywności) w czasie działania programu. Intencja reprezentuje „zamiar zrobienia czegoś” przez program. Intencji używa się do różnych celów, ale najczęściej do uruchamiania nowych aktywności.

W metodzie sendMessage() utworzymy intencję uruchamiającą aktywność o nazwie DisplayMessageActivity:

Intent intent = new Intent(this, DisplayMessageActivity.class);

Użyty tu konstruktor przyjmuje dwa parametry:

  • Pierwszym parametrem jest kontekst (Context) — słowo this zostało użyte dlatego, ponieważ Activity jest podklasą klasy Context.
  • Drugim parametrem jest klasa (Class) komponentu aplikacji, do którego system ma przekazać intencję — w tym przypadku jest to aktywność, która ma zostać uruchomiona.

Intencja umożliwia nie tylko uruchomienie nowej aktywności, ale może dodatkowo przekazać do niej różne dane. Za pomocą metody findViewById() można pobrać element EditText i dodać jego tekst do wartości intencji:

Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);

W intencji można przekazywać zbiory różnych typów danych w postaci par klucz-wartość zwanych dodatkami (ang. extras). Metoda putExtra() jako pierwszy parametr przyjmuje nazwę klucza i wartość jako drugi.

Aby następna aktywność „pytała” o te dodatkowe dane, klucz należy zdefiniować przy użyciu stałej publicznej. W związku z tym dodaj definicję EXTRA_MESSAGE na początku klasy MainActivity:

public class MainActivity extends Activity {
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    ...
}

Ogólnie jest dobrym zwyczajem w definicjach kluczy dla dodatków intencji używać nazwy pakietu aplikacji jako przedrostka. To zapewnia im niepowtarzalność na wypadek, gdyby aplikacja komunikowała się z innymi aplikacjami.

Uruchamianie drugiej aktywności

Aby uruchomić aktywność, należy wywołać metodę startActivity() i przekazać jej intencję. System odbierze to wywołanie i uruchomi egzemplarz klasy Activity określony przez intencję.

Teraz kompletny kod metody sendMessage() wywoływanej przez przycisk Send wygląda tak:

/** Wywoływana, gdy użytkownik kliknie przycisk Wyślij */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

Teraz, aby to zadziałało musimy utworzyć klasę DisplayMessageActivity.

Tworzenie drugiej aktywności

Rysunek 1. Kreator nowej aktywności w Eclipse
Rysunek 1. Kreator nowej aktywności w Eclipse

Aby utworzyć nową aktywność w Eclipse:

  1. Kliknij przycisk New na pasku narzędzi.
  2. W oknie, które zostanie wyświetlone otwórz folder Android i wybierz w nim pozycję Android Activity. Kliknij przycisk Next.
  3. W kolejnym oknie zaznacz pozycję BlankActivity i kliknij przycisk Next.
  4. Wprowadź dane aktywności:
    • Project (projekt): MyFirstApp
    • Activity Name (nazwa aktywności): DisplayMessageActivity
    • Layout Name (nazwa układu): activity_display_message
    • Navigation Type (typ nawigacji): None
    • Hierarchial Parent (rodzic w hierarchii): com.example.myfirstapp.MainActivity
    • Title (tytuł): My Message
    Kliknij przycisk Finish.

Jeśli używasz innego IDE albo narzędzi wiersza poleceń, utwórz nowy plik o nazwie DisplayMessageActivity.java w katalogu src/ projektu, w tym samym, w którym znajduje się oryginalny plik MainActivity.java.

Otwórz plik DisplayMessageActivity.java. Jeśli do jego utworzenia użyłeś Eclipse, klasa zawiera już implementację wymaganej metody onCreate(). Jest tam też implementacja metody onCreateOptionsMenu(), ale nie będziesz jej potrzebować w tej aplikacji, a więc możesz ją usunąć. Teraz kod tej klasy powinien wyglądać następująco:

public class DisplayMessageActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
    }
}

Wszystkie podklasy klasy Activity muszą mieć implementację metody onCreate(). System wywołuje ją podczas tworzenia nowego egzemplarza aktywności. To w niej definiuje się układ aktywności i dokonuje wstępnej konfiguracji jej składników.

Dodawanie aktywności do manifestu

Wszystkie aktywności muszą być zadeklarowane w pliku manifestu AndroidManifest.xml przy użyciu elementu <activity>.

Eclipse automatycznie tworzy domyślny wpis. Powinien on wyglądać następująco:

<application ... >
    ...
    <activity
        android:name=".DisplayMessageActivity"
        android:label="@string/title_activity_display_message" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

Element <meta-data> deklaruje nazwę aktywności nadrzędnej tej aktywności w logicznej hierarchii aplikacji. Informacje te są wykorzystywane w bibliotece pomocniczej Androida do implementacji domyślnych działań nawigacji, takich jak np. przejście do góry.

Teraz aplikacja da się już uruchomić, ponieważ intencja w pierwszej aktywności wiąże się już z klasą DisplayMessageActivity. Jeśli uruchomisz aplikację teraz, kliknięcie przycisku Send spowoduje uruchomienie drugiej aktywności, ale nadal będzie używany domyślny układ „Hello world”.

Odbieranie intencji

Każda aktywność jest wywoływana przez intencję, niezależnie od sposobu, w jaki dostał się do niej użytkownik. Za pomocą metody getIntent() można sprawdzić, która intencja uruchomiła daną aktywność i pobrać znajdujące się w niej dane.

W metodzie onCreate() klasy DisplayMessageActivity pobieramy intencję i wydobywamy z niej wiadomość przekazywaną przez MainActivity:

Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

Wyświetlanie wiadomości

Aby wyświetlić wiadomość na ekranie, utwórz element TextView i ustaw jego tekst za pomocą metody setText(). Następnie dodaj TextView jako widok główny układu aktywności przekazując go do metody setContentView().

Teraz kompletny kod metody onCreate() klasy DisplayMessageActivity wygląda tak:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Pobranie wiadomości od intencji
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Utworzenie widoku tekstu
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Ustawienie widoku tekstu jako układu aktywności
    setContentView(textView);
}

Teraz można już uruchomić aplikację. Gdy aplikacja się uruchomi, wpisz jakiś tekst w polu tekstowym, kliknij przycisk Wyślij i wiadomość ta pojawi się w drugiej aktywności.

Rysunek 2. Obie aktywności w ukończonej aplikacji w systemie Android 4.0
Rysunek 2. Obie aktywności w ukończonej aplikacji w systemie Android 4.0

To wszystko. Ukończyłeś swoją pierwszą aplikację Android!

Jeśli chcesz nauczyć się więcej na temat tworzenia aplikacji Android, przeczytaj kolejne lekcje kursu. W następnej lekcji nauczysz się zarządzać cyklem życia aktywności.

Autor: Google

Źródło: https://developer.android.com/training/basics/firstapp/starting-activity.html

Tłumaczenie: Łukasz Piwko

Treść tej strony jest dostępna na zasadach licencji CC BY 2.5

8 komentarzy do “Lekcja 2.4. Uruchamianie nowej aktywności”

  1. Witam. Naprawdę ciekawy opis xmla etc. Tylko część o intencjach jest zamieszana strasznie. Zapewne jest to zrozumiałe dla kogos kto już wie o co chodzi. Np .”słowo this zostało użyte dlatego, ponieważ Activity jest podklasą klasy Context. Pierwszy raz dowiaduję się o klasie Context i to zdanie nic nie wyjaśnia.(dlatego bo tak 😛 ) Dziękuje mimo wszystko . O inny opis reszty zagadnienia będe musiał sie postarać na google.Pozdrawiam

  2. Skoro już tłumaczysz z angielskiego artykułu, to chociaż dokładnie… w pierwszym kroku activity_main.xml, a nie main.xml. Pozdr.

  3. mam problem z dodaniem odpowiedniej metody do przycisku, wpisałem kropka w kropkę klasę podaną powyżej w MainActivity.java i wprowadziłem komendę by uzupełnić braki klasy ale wyskakują mi dwa Errory. Czy w dobrym pliku to umiejscowiłem? Proszę o pomoc

  4. Super poradnik, mocno mi pomogł, a to ze tlumaczony to nawet lepiej bo angielski slabiej ogarniam 😀

  5. Brakuje tam kawałka kodu z Manifestu, który jest generowany. U mnie wygląda to tak:

Możliwość komentowania została wyłączona.