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.