Lekce 3 - Android Intenty a aktivity - SumActivity - Java kód
V minulé lekci, Android Intenty a aktivity - SumActivity - Součet čísel, jsme si připravili GUI aktivity pro součet 2 čísel.
V Java tutoriálu si napíšeme kód Android aktivity
SumActivity
, používající explicitní intent pro otevření
druhé aktivity s obousměrnou výměnou dat mezi nimi. Než začneme psát Java
kód SumActivity
, vytvoříme rozhraní pro deklarace všech
konstant ukázkové aplikace Activities
.
V aplikaci máme totiž několik aktivit a nechceme každé definovat konstanty zvlášť. Některé budou určitě potřebovat ty samé. Proto je definujeme centrálně v jednom rozhraní.
Rozhraní pro konstanty
Ve struktuře projektu klikneme pravým tlačítkem na složku (viz. obrázek) a v menu přes New na Java Class:
V otevřeném okně New Java Class do jediného políčka napíšeme
AppConstants
. Pod políčkem vybereme možnost Interface a
potvrdíme klávesou Enter :
Bude vytvořen soubor AppConstants.java
:
public interface AppConstants { }
Do tohoto souboru budeme postupně přidávat konstanty, použité v projektu.
Konstanta LOG_TAG
Hned přidáme konstantu pro tag zpráv Logcatu:
public interface AppConstants { String LOG_TAG = "Activities_log_tag"; }
Takto můžeme pak snadno poznat naše logy.
Přístup ke konstantám
Přístup ke konstantám je možný dvěma způsoby. První způsob je přímo, například voláním:
String tag = AppConstants.LOG_TAG;
Nebo může třída, ve které konstantu potřebujeme, implementovat
rozhraní AppConstants
, čímž získá přístup ke všem jeho
konstantám:
public class MyClass implements AppConstants { String tag = LOG_TAG; }
Aktivita SumActivity.java
Vraťme se zpět k aktivitě SumActivity
. Nyní upravíme její
Java kód na následující:
public class SumActivity extends AppCompatActivity { EditText etNumber1, etNumber2; // Políčko pro zadání čísel k součtu Button btnSend; // Tlačítko pro odeslní čísel do SumResultActivity TextView labelResult; // Label pro zobrazení vráceného součtu zadaných čísel int number1, number2; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sum_activity); setTitle(R.string.sum_activity_title); etNumber1 = findViewById(R.id.etNumber1); etNumber2 = findViewById(R.id.etNumber2); labelResult = findViewById(R.id.labelResult); btnSend = findViewById(R.id.btnSend); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { number1 = Integer.parseInt(etNumber1.getText().toString()); number2 = Integer.parseInt(etNumber2.getText().toString()); sendData(); } catch (NumberFormatException e) { showErrorToast(); } catch (NullPointerException e) { showErrorToast(); } } }); } private void showErrorToast() { Toast.makeText(this, R.string.info_incorrect_entry, Toast.LENGTH_LONG).show(); } }
Pojďme si jej vysvětlit:
Kliknutí na tlačítko
V ActivityMain.java
jsme události kliknutí nastavili
příslušnými parametry tlačítek v XML a deklarací
obslužné metody v Java kódu. Zde to děláme pro změnu pouze Java
kódem, přesněji přiřazením OnClickListener
komponentám, na
kterých budeme kliknutí očekávat. Nastavení listeneru zde provádíme
inline anonymní třídou. Na tomto přístupu není nic špatného, ale má
nevýhodu ve větším množství Java kódu a v nemožnosti kód znovu
použít.
Kliknutím na tlačítko Odeslat k výpočtu zadaná čísla
odesíláme do aktivity SumResultActivity
, jejímž úkolem je
čísla sečíst a výsledek odeslat zpět do aktivity SumActivity
.
Zadání uživatele v políčkách EditText
převádíme z typu
String
na typ int
voláním metody
parseInt()
třídy Integer
.
Během konverze může, v případě, že zadaný text obsahuje znak, který
není číslicí, dojít k výjimce NumberFormatException
. To je
první ze dvou důvodů, proč je tato část kódu "zabalena" do bloku
try
- catch
. Druhým důvodem je fakt, že řádek
etNumberOne.getText().toString()
může vyvolat výjimku
NullPointerException
. Zmíněné případné výjimky tedy
odchytáváme a můžeme na ně reagovat, aniž by došlo k pádu aplikace.
Otevření aktivity pro součet zadaných čísel
Po úspěšné konverzi vstupu voláme metodu sendData()
.
Přidejme si ji do třídy:
private void sendData() { }
Metodu zatím necháme prázdnou. Po vytvoření aktivity
SumResultActivity
(pro samotný součet čísel) kód metody
sendData()
doplníme.
Úprava Java kódu hlavní aktivity
Nyní, když máme hotovou aktivitu SumActivity
, doplníme v
MainActivity
kus kódu do první větve konstrukce
switch
v metodě click()
. Tímto bude první
tlačítko s textem Součet čísel ukázkové aplikace funkční.
Metoda click()
bude nyní vypadat takto:
public void click(View view) { switch (view.getId()) { case R.id.btnSumActivity: Intent intentSumActivity = new Intent(MainActivity.this, SumActivity.class); startActivity(intentSumActivity); break; case R.id.btnMapActivity: break; case R.id.btnPhoneActivity: break; case R.id.btnPhotoActivity: break; case R.id.btnShareActivity: break; case R.id.btnITnetwork: Intent webIntent = new Intent(Intent.ACTION_VIEW); webIntent.setData(Uri.parse("https://www.itnetwork.cz/")); if (webIntent.resolveActivity(getPackageManager()) != null) { startActivity(webIntent); } break; } }
V doplněné první větvi přepínače switch
, v prvním
řádku, vytváříme explicitní intent pro otevření aktivity
SumActivity
. V druhém řádku tuto aktivitu, voláním metody
startActivity()
, otevíráme. Voláním metody
startActivity()
otevíráme aktivitu, která nebude po svém
ukončení odesílat žádná data. Výše popsaný nový způsob získávání
dat ze zavřené aktivity se tedy netýká tohoto případu.
Připomeňme si, že metoda click()
je námi
deklarovaná metoda a v XML návrhu hlavní aktivity je všem tlačítkům
nastavena jako obsluha události kliknutí takto:
android:onClick="click"
.
V následujícím kvízu, Kvíz - Nastavení vzhledu aktivity a intenty v Androidu, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.