12
Zatím si naše aplikace vystačila s jednou obrazovkou (aktivitu). Ukažme si nyní, jak vytvořit novou obrazovku naší aplikace. Obrazovku bude reprezentovat novoá třída, která bude potomkem třídy Activity. Ukážeme si, jak novou obrazovku můžeme zobrazit v reakci na stisk tlačítka či volby v menu. Nezapomeneme ani na návod, jak předat nové aktivitě doplňující parametry. Například když v menu zvolíme pokyn k úpravě údajů záznamu ze seznamu, musíme navazující obrazovce sdělit, kterého záznamu se pokyn týká.
K vytvoření aktivity použijeme v Android Studiu průvodce, kterého spustíme:
Tímto postupem vznikl ve složce res/layout nový soubor XML, který popisuje vzhled nové obrazovky. Zároveň vznikne ve složce java/název_balíčku nová třída, která bude potomkem třídy Activity.
Pro vyvolání obrazovky použijeme třídu Intent. Jako parametr konstruktoru nastavíme kontext (typicky píšeme this, neboť kód je součástí rodičovské aktivity) a třídu aktivity, kterou chceme vyvolat.
Následně použijeme metodu startActivity(), které předáme jako parametr vytvořenou instanci třídy Intent.
Intent intent = new Intent(this, UpravZaznamActivity.class); this.startActivity(intent);
Tento kód použijeme například v reakci na tlačítko nebo volbu v menu v okamžiku, kdy se má nová obrazovka vyvolat.
Pokud chceme vytvářené aktivitě předat při jejím spuštění doplňující informace, použijeme třídu Bundle, která umožní do instance Intent zahrnout dodatečné informace.
Třída vždy předává dvojice (klíč , hodnota). Klíčem může být libovolný text. Doporučuje se klíče do aplikace zahrnout jako třídní, veřejně přístupné konstanty (final static …) ve volající aktivitě.
Ve volající aktivitě tedy přidáme konstantu:
public final static String ID_NAZEV_PROMENNE = "cz.balicek.nazev_projektu.udaj";
Do kódu pro spuštění aktivity přidáme řádek, který připojí pár (název_proměnné, hodnota):
IIntent intent = new Intent(this, NazevAktivity.class); intent.putExtra(VyberActivity.ID_NAZEV_PROMENNE, data); this.startActivity(intent);
Nakonec je ve volané aktivitě třeba zpracovat dodatečné informace předané jako parametry. To provedeme v metodě onCreate(...):
Bundle b = getIntent().getExtras(); if (b != null) { this.zvolenyKlient = b.getInt(VyberActivity.ID_PREDANI_PORADI_KLIENTA); }
Vyzkoušejte nyní upravit projekt tak, aby menu obsahovalo položku „Přidat záznam...“. Po kliknutí na tuto položku se objeví nové okno, ve kterém se zobrazí jméno klienta jako TextView.
UpravZaznamActivity. Rodičovská aktivita bude hlavní aktivita aplikace. Titulek nastavíme na „Upravte záznam...“.LinearLayout, nezapomeňte na nastavení orientace. Ale můžete použít i grafický návrhář a RelativeLayout.et_nazev, et_popis a check_dulezite.<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" ... tools:context="local.test.simunek_martin.vyuka.UpravZaznamActivity" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Název: "/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_nazev" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Popis: "/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_popis" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/check_dulezite" android:text="Důležité"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Ulož!" /> </LinearLayout>
Bundle:public final static String ID_ZAZNAM = "local.test.prijemni.pestry_zivot.upravovany_zaznam";
public boolean onContextItemSelected(MenuItem item) { Zaznam zaznam; AdapterView.AdapterContextMenuInfo infoOZvolenePolozce = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); switch(item.getItemId()) { case R.id.km_change_importance: zaznam = this.zaznamy.getZaznam(infoOZvolenePolozce.position); zaznam.invertujDulezite(); return true; case R.id.km_edit: zaznam = this.zaznamy.getZaznam(infoOZvolenePolozce.position); Intent intent = new Intent(this, UpravZaznamActivity.class); intent.putExtra(this.ID_ZAZNAM, zaznam); this.startActivity(intent); return true; case R.id.km_remove: this.zaznamy.odstranZaznam(infoOZvolenePolozce.position); default: return super.onContextItemSelected(item); } }
UpravZaznamActivity převezmeme pomocí třídy Bundle upravovaný záznam a hodnoty textových polí nastavíme podle hodnot tohoto záznamu:UpravZaznamActivity nastavíme reakci:<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="ulozZaznam" android:text="Ulož!" />
Intent.Bundle předat nově vytvořené parametry parametry.