Lekce 2 - Android Intenty a aktivity - SumActivity - Součet čísel
V minulé lekci, Android Intenty a aktivity - Úvod a hlavní aktivita, jsme zahájili práci na ukázkové Android aplikaci se šesti tlačítky, kterými se přepínáme mezi jednotlivými funkcemi.
K otevření jiné aktivity potřebujeme Intent
(můžeme
přeložit jako záměr). V základním Android
kurzu je použití intentů (v souvislosti s otevíráním aktivit) jen
lehce zmíněno bez většího vysvětlení. Zde si jej vysvětlíme
podrobněji.
Intent
Jedná se o objekt s informacemi pro systém, obsahující popis operace
(záměru), která má být provedena. Intenty jsou jedním z prostředků,
sloužících k meziprocesové komunikaci, a neslouží pouze k otevírání
aktivit. Dále můžeme Intent
použít jako kontejner
primitivních dat, čehož také využijeme.
Intent
je objekt skládající se, v případě otevírání
aktivit, ze dvou částí:
- akce - Druh činnosti, která má být provedena (např. zobrazení webu).
- data - Data, která potřebujeme aktivitě nebo systému předat (např. URL webu).
Explicitní a implicitní intenty
Existují dva základní typy intentů:
- Explicitní intent - přesně určuje akci (třídu), která má být spuštěna. Systému dáme úkol, který "bez přemýšlení" provede. V hlavní aktivitě, popsané v předchozí lekci, prvních pět tlačítek otevírá jiné aktivity právě explicitním intentem.
- Implicitní intent - určuje, co se má stát, ale již neříká, jak se to má stát. Systému pouze předáme informace, na základě kterých rozhodne, jak náš záměr uskuteční. Příkladem může být poslední tlačítko ITnetwork.cz (otevření webu) naší ukázkové aplikace, kdy systému řekneme, že chceme zobrazit web ITnetwork.cz. Intentu nastavíme data v podobě URL a o víc se nestaráme, protože v práci bude pokračovat systém. Ten intent "přečte" a zjistí, že chceme zobrazit web s přiloženou URL. Systém pokračuje hledáním nainstalovaných aplikací schopných tento záměr vykonat. Uživateli nabídne možnost jednu z nich spustit a tím náš záměr dokončit.
Aktivita SumActivity
-
Součet čísel
Nyní vytvoříme aktivitu SumActivity
, kterou budeme otevírat
z hlavní aktivity prvním tlačítkem. Zde budeme zadávat dvě čísla
určená k součtu. Výpočet můžeme udělat přímo v aktivitě
SumActivity
, ale abychom si ukázali obousměrnou komunikaci dvou
aktivit, bude tuto operaci provádět další aktivita
SumResultActivity
, která výsledek pak vrátí zpět do
aktivity SumActivity
.
Vytvoření
souborů SumActivity.java
a sum_activity.xml
V Android Studiu, v okně se strukturou projektu, klikneme pravým tlačítkem myši na složku podle následujícího obrázku a v zobrazeném menu zvolíme New -> Activity -> Empty Activity:
Otevře se okno New Android Activity:
V otevřeném okně do pole Activity Name napíšeme
SumActivity
, zaškrtneme políčko Generate Layout File a
do pole Layout Name napíšeme sum_activity
. Poté okno
zavřeme tlačítkem Finish.
Android Studio vygeneruje soubory pro Java kód a druhý pro XML návrh grafického uživatelského rozhraní.
sum_activity.xml
Soubor pro uživatelské rozhraní upravíme do následující podoby:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/bg_activity_sum_activity" android:scrollbars="vertical"> <Button android:id="@+id/btnSend" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginTop="10dp" android:text="@string/activity_main_btn_sum_activity" android:textAllCaps="false" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/btnSend" android:background="@color/bg_activity_sum_activity" android:padding="10dp" android:scrollbars="vertical"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:scrollbars="vertical"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/sum_activity_title" android:textColor="@color/text_color_activity_sum_activity" android:textSize="30sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text="@string/sum_activity_desc" android:textColor="@color/text_color_activity_sum_activity" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:text="@string/sum_activity_number_1" android:textColor="@color/text_color_activity_sum_activity" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView2" /> <EditText android:id="@+id/etNumber1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:ems="10" android:inputType="number" android:textColor="@color/text_color_activity_sum_activity" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView3" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:text="@string/sum_activity_number_2" android:textColor="@color/text_color_activity_sum_activity" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/etNumber1" /> <EditText android:id="@+id/etNumber2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:ems="10" android:inputType="number" android:textColor="@color/text_color_activity_sum_activity" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView4" /> <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:text="@string/sum_activity_result" android:textColor="@color/text_color_activity_sum_activity" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/etNumber2" /> <TextView android:id="@+id/labelResult" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:gravity="center_horizontal" android:text="0" android:textColor="@color/text_color_activity_sum_activity" android:textSize="30sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView5" /> </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView> </RelativeLayout>
Na začátku obrazovky máme tlačítko pro návrat do menu a nadpis
aktivity. Níže pak máme několik <TextView>
s informacemi
pro uživatele a komponenty <EditText>
pro zadání čísel k
sečtení. Nakonec zobrazujeme výsledek a tlačítko k odeslání k výpočtu.
Nic složitého.
Konstanty použitých textů
Soubor res/values/strings.xml
doplníme o následující
položky s texty použitými v projektu:
<string name="sum_activity_title">SumActivity</string> <string name="sum_activity_desc">Oboustranná komunikace dvou aktivit. Tato aktivita od uživatele získá dvě čísla, která tlačítkem odešleme do jiné aktivity, kde tato čísla budou sečtena a výsledek bude vrácen do této aktivity.</string> <string name="sum_activity_number_1">První číslo:</string> <string name="sum_activity_number_2">Druhé číslo:</string> <string name="sum_activity_result">Výsledek výpočtu:</string> <string name="suma_ctivity_button">Odeslat k výpočtu</string> <string name="info_no_result">Nepřišel žádný výsledek...</string> <string name="info_error_loading_result">Chyba načítání výsledku...</string> <string name="info_incorrect_entry">Chybné zadání...</string> <string name="incoming_intent_data_error">Chyba přijatých dat...</string>
Konstanty použitých barev
Podobně doplníme soubor res/values/colors.xml
o dvě položky
s barvou pozadí aktivity a s barvou textu:
<color name="bg_activity_sum_activity">#AE3128</color> <color name="text_color_activity_sum_activity">#EEEEEE</color>
Výstup XML kódu bude vypadat takto:
Je tu jedna odlišnost od hlavní aktivity - tlačítko nemá v XML atribut
android:onClick
pro obsloužení události kliknutí. Tuto událost
obsloužíme totiž přímo v kódu v souboru SumActivity.java
,
abychom si vyzkoušeli další způsob obsloužení události kliknutí.
V příští lekci, Android Intenty a aktivity - SumActivity - Java kód, si použití intentů ukážeme na první ukázce
z naší ukázkové aplikace Activities
.