Przesyłanie danych między Aktywnościami w Androidzie

W poprzednim artykule na temat programowania w Androidzie, opisywałem co to są Aktywności, jaki jest ich cykl życia oraz jak je uruchomić. Część z was, podczas lektury poprzedniego postu pewnie pomyślała sobie, „ok, ale jak przesłać między tymi oknami dane?” jeśli tak to właśnie ten dylemat rozwiążemy w tym artykule. A więc do dzieła!

Fot: mammela, CC0 Public Domain.

Fot: mammela, CC0 Public Domain.

Założeniem projektantów systemu Android jest to, aby każda aplikacja składała się z różnych niezależnych od siebie okien. W tym celu programistą został więc udostępniony mechanizm Aktywności. Jednak, należy pamiętać o tym, że choć każde okno jest oddzielne to dane wprowadzone w jednym mogą być potrzebne w drugim. Jest to rzecz tak naturalna, że specjalnie do tego został zaprojektowany odpowiedni mechanizm służący właśnie do przekazywania między aktywnościami różnych obiektów.

Jak to wszystko się odbywa?

A więc tak, stanem wyjściowym będzie nowy projekt stworzony w artykule „pierwsza aplikacja w Android Studio„. Jego struktura prezentuje się tak:

proj-start-dane-aktywnosc

Na samym początku w layoucie activity_main.xml musimy dodać przycisk, który po kliknięciu będzie uruchamiał drugą aktywność. Przeciągamy więc z toolboxa odpowiednią kontrolkę i zmieniamy zawartość przyciska na tekst „Nowa aktywność„:

dodanie-buttona-dane-aktywnosci

Następnie w pliku MainActivity.java tworzymy nową metode o nazwie nextStep(View view). Jej kod wygląda następująco:

Teraz z poworotem przechodzimy do activity_main.xml i po kliknięciu w buttona w prawej kolumnie „Properties” (pl. właściwości) odszukujemy pozycji o nazwie onClick i z listy wybieramy nowo dodaną metodę:

dodanie-metody-onclick-dane-aktywnosci

Kod naszego buttonu wygląda tak (można go wkleić do pliku z layoutem):

Ok, teraz zgodnie z instrukcjami z artykułu „Aktywności w Androidzie” dodajemy do projektu nową aktywność o nazwie „SecondActivity„. Jako typ aktywności wybieramy na przykład „Blank Activity„.

Wracamy do metody nextStep() i wpisujemy tam kod, który uruchomi drugą aktywność czyli SecondActivity (szczegóły omawiane były w artykule „Aktywności w Androidzie„). Kod naszej metody wygląda więc następująco:

Teraz możemy uruchomić nasz projekt, i po kliknięciu w przycisk „Nowa aktywność” zostaniemy przeniesieni do nowego okna. Zbierzmy się więc za przekazywanie danych.

putExtra() co to takiego?

Tworząc obiekt typu Intent mamy publicznie dostępną metodę o nazwie putExtra(). Jest to metoda, która umożliwia nam przesyłanie danych z jednej aktywności do drugiej. Załóżmy, że w MainActivity wczytujemy jakieś tam informacje podane przez użytkownika – na potrzeby tego przykładu nie ma znaczenia w jaki sposób to robimy więc załóżmy, że wszystkie potrzebne dane mamy zapisane w polu typu String o nazwie name. Pole to jest publicznie dostępne w klasie MainActivity.

Nasz dotychczasowy kod:

Teraz chcemy dane zapisane w polu name przesłać do drugiej aktywności o nazwie SecondActivity. Wykorzystamy do tego omówioną wyżej metodę:

W ten właśnie sposób dodajemy do nowego Inentu dane, które będziemy mogli odczytać w drugiej aktywności.

Jak pewnie zauważyliście metoda putExtra() przyjmuje dwa argumenty, pierwszy typu String to unikalna nazwa danych, które przesyłamy, a drugi to przesyłany obiekt.

Uwaga: Nie każdy obiekt możemy w ten sposób przesłać do drugiej aktywności. Dozwolone są następujące typu obiektów:

  • putExtra(String name, Parcelable value);
  • putExtra(String name, long[] value);
  • putExtra(String name, byte value);
  • putExtra(String name, double[] value);
  • putExtra(String name, CharSequence value);
  • putExtra(String name, boolean[] value);
  • putExtra(String name, int value);
  • putExtra(String name, char[] value);
  • putExtra(String name, byte[] value);
  • putExtra(String name, Parcelable[] value);
  • putExtra(String name, Bundle value);
  • putExtra(String name, CharSequence[] value);
  • putExtra(String name, float[] value);
  • putExtra(String name, double value);
  • putExtra(String name, int[] value);
  • putExtra(String name, String[] value);
  • putExtra(String name, short[] value);
  • putExtra(String name, boolean value);
  • putExtra(String name, String value);
  • putExtra(String name, long value);
  • putExtra(String name, char value);
  • putExtra(String name, Serializable value);
  • putExtra(String name, float value);
  • putExtra(String name, short value);

Cały kod metody nextStep():

Odczyt danych

Kiedy już uruchomimy drugą aktywność pasowało by odczytać wszystkie przesłane dane. Aby to zrobić musimy skorzystać z odpowiedniej metody obiektu Intent – oczywiście wcześniej pobierając odpowiedniego Intenta oraz jako argument podać unikalną nazwę naszych danych podaną przy zapisywaniu ich.

Dla Stringa będzie to wyglądało tak:

Gdzie jako argument metody getStringExtra() podaliśmy unikalną nazwę naszych danych zapisaną w poprzednim Intencie (w metodzie putExtra()).

Uwaga: Każdy typ obiektu odczytujemy inną metodą:

boolean getBooleanArrayExtra(String name);
Bundle getBundleExtra(String name);
byte[] getByteArrayExtra(String name);
byte getByteExtra(String name, byte defaultValue);
char[] getCharArrayExtra(String name);
char getCharExtra(String name, char defaultValue);
CharSequence[] getCharSequenceArrayExtra(String name);
ArrayList<CharSequence> getCharSequenceArrayListExtra(String name);
CharSequence getCharSequenceExtra(String name);
double[] getDoubleArrayExtra(String name);
double getDoubleExtra(String name, double defaultValue);
Bundle getExtras();
float[] getFloatArrayExtra(String name);
float getFloatExtra(String name, float defaultValue);
int[] getIntArrayExtra(String name);
int getIntExtra(String name, int defaultValue);
ArrayList<Integer> getIntegerArrayListExtra(String name);
long[] getLongArrayExtra(String name);
long getLongExtra(String name, long defaultValue);
Parcelable[] getParcelableArrayExtra(String name);
<T extends Parcelable>ArrayList<T> getParcelableArrayListExtra(String name);
<T extends Parcelable> T getParcelableExtra(String name);
Serializable getSerializableExtra(String name);
short[] getShortArrayExtra(String name);
short getShortExtra(String name, short defaultValue);
String[] getStringArrayExtra(String name);
ArrayList<String> getStringArrayListExtra(String name);
String getStringExtra(String name);

Cały kod naszej drugiej aktywności:

Gotowe teraz wiemy już jak przekazywać dane między różnymi oknami w naszej aplikacji.

, , , , , , , , ,