W tej lekcji:
- Reagowanie na zdarzenia naciśnięcia przycisku
- Budowanie intencji
- Uruchamianie drugiej aktywności
- Tworzenie drugiej aktywności
- Odbieranie intencji
- 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łowothiszostało użyte dlatego, ponieważActivityjest podklasą klasyContext. - 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
Aby utworzyć nową aktywność w Eclipse:
- Kliknij przycisk New na pasku narzędzi.
- W oknie, które zostanie wyświetlone otwórz folder Android i wybierz w nim pozycję Android Activity. Kliknij przycisk Next.
- W kolejnym oknie zaznacz pozycję BlankActivity i kliknij przycisk Next.
- 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
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:
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.
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.
Publikacja ta jest dostępna na zasadach licencji Creative Commons Attribution 2.5. Szczegółowe informacje na ten temat znajdują się w treści licencji.








Wysyłam...
Komentarzy: 7
xarlos
08.10.2014
Super poradnik, mocno mi pomogł, a to ze tlumaczony to nawet lepiej bo angielski slabiej ogarniam :D
sensej
04.11.2013
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
Łukasz Piwko
04.11.2013
A jakie to są errory?
sensej
04.11.2013
pierwszy: Error generating final archive.io.FileNotFoundException:(folder z zapisem moim)\bin\resources.ap_does not exist
drugi:Unparsed aapt error(s)! Check the console for output
zapewne jakieś podstawowy błąd zrobiłem ale nie mogę dojść, 2gi dzień dopiero uczę się eclipse i android
qwertyx
03.11.2013
Skoro już tłumaczysz z angielskiego artykułu, to chociaż dokładnie… w pierwszym kroku activity_main.xml, a nie main.xml. Pozdr.
Łukasz Piwko
03.12.2013
Skoro już tak ostro krytykujesz, to napisz program, w którym nie będzie ani jednego błędu. A przechodząc do rzeczy, dzięki za informację. Poprawione.
galalmighty
01.15.2013
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 :P ) Dziękuje mimo wszystko . O inny opis reszty zagadnienia będe musiał sie postarać na google.Pozdrawiam
Nie ma trackbacków do wyświetlenia