12

Vyvolání nové obrazovky
(Activity)

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á.


Vytvoření nové obrazovky (aktivity)

K vytvoření aktivity použijeme v Android Studiu průvodce, kterého spustíme:

  1. Kliknutím pravým tlačítkem na položku s názvem balíčku ve stromě projektu.
    Dále volíme New → Activity → Blank Activity.

  2. V průvodci zadáme název nové aktivity, název balíčku ponecháme. Položka Title je titulek, který bude zobrazen jako popis aktivity.

  3. Uvedeme nadřazenou aktivitu (Hierarchical Parent). Nadřazená aktivita je ta obrazovka, na kterou se uživatel dostane, když klikne vlevo nahoře na tlačítko „Up“ (ikonka s logem aplikace a šipkou vlevo, která je nahoře v dialogu/obrazovce).

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.


Vyvolání obrazovky v kódu aplikace

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.


Předání doplňujících informací pro novou obrazovku

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);
}

Příklad: Můj pestrý život

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.

  1. Vytvořte novou aktivitu s názvem UpravZaznamActivity. Rodičovská aktivita bude hlavní aktivita aplikace. Titulek nastavíme na „Upravte záznam...“.

  2. Přidejte textová pole „Nazev“ a „Popis“. Můžete přidat i zatrhávací pole „Důležité“. Pro uspořádání nové aktivity se bude hodit LinearLayout, nezapomeňte na nastavení orientace. Ale můžete použít i grafický návrhář a RelativeLayout.
    Nově vytvářeným editačním prvkům nezapomeňte přiřadit id, například: et_nazev, et_popis a check_dulezite.

  3. <?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>
    

  4. Do hlavní aktivity si připravíme konstantu pro předávání hodnoty přes Bundle:

  5. public final static String ID_ZAZNAM = "local.test.prijemni.pestry_zivot.upravovany_zaznam";
    

  6. Doplníme vytvoření nové aktivity jako reakci na volbu Uprav v kontextovém menu hlavní aktivity. Doposud jsme jako reakci pouze vypsali upozornění, že volba ještě není implementována:

  7. 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);
        }
    }
    

  8. V metodě onCreate nové aktivity UpravZaznamActivity převezmeme pomocí třídy Bundle upravovaný záznam a hodnoty textových polí nastavíme podle hodnot tohoto záznamu:

  9. Tlačítku v XML popisu nové aktivity UpravZaznamActivity nastavíme reakci:

  10. <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="ulozZaznam"
        android:text="Ulož!" />
    

  11. V reakci na stisk tlačítka vezmeme hodnoty z textových polí a checkboxu uložíme je do záznamu, který upravujeme.

Shrnutí

  1. Ukázali jsme si, jak vytvořit novou obrazovku, jak ji vyvolat a jak předat parametry spuštění.

  2. Naučili jsme se vyvolat novou obrazovku pomocí třídy Intent.

  3. Ukázali jsme si, jak pomocí třídy Bundle předat nově vytvořené parametry parametry.