Tvorba aplikací pro Android

12

Vyvolání nové obrazovky
(Activity)

Zatím si naše ap­likace vystačila s jedno­u ob­razov­kou (ak­tivitu). Ukažme si nyní, jak vytvořit novou ob­razov­ku naší ap­likace. Ob­razov­ku bude re­prezen­tovat novoá třída, která bude potom­kem třídy Activity. Ukážeme si, jak novou ob­razov­ku můžeme zob­razit v rea­kci na stisk tlačítka či volby v menu. Nezapomeneme ani na návod, jak předat nové ak­tivitě doplňující para­met­ry. Například když v menu zvolíme pokyn k úpravě údajů záznamu ze sez­namu, musíme navazující ob­razov­ce sdělit, kterého záznamu se pokyn týká.


Vytvoření nové ob­razov­ky (ak­tiv­ity)

K vytvoření ak­tiv­ity použijeme v An­droid Studiu průvodce, kterého spustíme:

  1. Klik­nutím pravým tlačítkem na položku s názvem balíčku ve stromě pro­jek­tu.
    Dále volíme New → Ac­tiv­ity → Blank Ac­tiv­ity.

  2. V průvodci zadáme název nové ak­tiv­ity, název balíčku ponec­háme. Položka Title je titulek, který bude zob­raz­en jako popis ak­tiv­ity.

  3. Uvede­me nad­řazenou ak­tivitu (Hierarch­ical Parent). Nadřazená ak­tivita je ta ob­razov­ka, na kterou se uživatel dos­tane, když klik­ne vlevo nahoře na tlačítko „Up“ (ikon­ka s logem ap­likace a šipkou vlevo, která je nahoře v di­alogu/ob­razov­ce).

Tímto pos­tupem vznikl ve složce re­s/layout nový soubor XML, který popisuje vzhled nové ob­razov­ky. Zároveň vznik­ne ve složce java/­název_balíč­ku nová třída, která bude potom­kem třídy Ac­tiv­ity.


Vyvolání ob­razov­ky v kódu ap­likace

Pro vyvolání ob­razov­ky použijeme třídu In­tent. Jako para­metr konstruk­toru nas­tavíme kon­text (typic­ky píšeme this, neboť kód je součástí rodičovské ak­tiv­ity) a třídu ak­tiv­ity, kterou chceme vyvolat.


Následně použijeme metodu star­tActiv­ity(), které předáme jako para­metr vytvořenou in­stan­ci třídy In­tent.

Intent intent = new Intent(this, UpravZaznamActivity.class);
this.startActivity(intent);

Tento kód použijeme například v rea­kci na tlačítko nebo volbu v menu v okamžiku, kdy se má nová ob­razov­ka vyvolat.


Předání doplňujících in­for­mací pro novou ob­razov­ku

Pokud chceme vytvářené ak­tivitě předat při jejím spuštění doplňující in­for­mace, použijeme třídu Bundle, která umožní do in­stan­ce Intent zahrnout dodatečné in­for­mace.


Třída vždy předává dvojice (klíč , hod­nota). Klíčem může být li­bovolný text. Doporučuje se klíče do ap­likace zahrnout jako třídní, veřejně přístupné konstan­ty (final static …) ve volající ak­tivitě.


Ve volající ak­tivitě tedy přidáme konstan­tu:

public final static String ID_NAZEV_PROMENNE = "cz.balicek.nazev_projektu.udaj";

Do kódu pro spuštění ak­tiv­ity přidáme řádek, který připojí pár (název_proměnné, hod­nota):

IIntent intent = new Intent(this, NazevAktivity.class);
intent.putExtra(VyberActivity.ID_NAZEV_PROMENNE, data);
this.startActivity(intent);

Nakonec je ve volané ak­tivitě třeba zpracovat dodatečné in­for­mace předané jako para­met­ry. To pro­vedeme 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

Vyz­koušej­te nyní up­ravit pro­jekt tak, aby menu ob­sahovalo položku „Přidat záznam...“. Po klik­nutí na tuto položku se objeví nové okno, ve kterém se zob­razí jméno klien­ta jako TextView.

  1. Vytvořte novou ak­tivitu s názvem UpravZaznamActivity. Rodičovská ak­tivita bude hlavní ak­tivita ap­likace. Titulek nas­tavíme na „Up­ravte záznam...“.

  2. Přidej­te tex­tová pole „Nazev“„Popis“. Můžete přidat i zatrhávací pole „Důležité“. Pro uspořádání nové ak­tiv­ity se bude hodit LinearLayout, nezapomeň­te na nas­tav­ení orien­tace. 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_popischeck_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í ak­tiv­ity si připravíme konstan­tu pro předávání hod­noty přes Bundle:

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

  6. Doplníme vytvoření nové ak­tiv­ity jako rea­kci na volbu Uprav v kon­textovém menu hlavní ak­tiv­ity. Doposud jsme jako rea­kci pouze vyp­sali upozor­nění, že volba ještě není im­plemen­tová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é ak­tiv­ity UpravZaznamActivity převez­meme pomocí třídy Bundle up­ravovaný záznam a hod­noty tex­tových polí nas­tavíme podle hod­not tohoto záznamu:

  9. Tlačítku v XML popisu nové ak­tiv­ity UpravZaznamActivity nas­tavíme rea­kci:

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

  11. V rea­kci na stisk tlačítka vez­meme hod­noty z tex­tových polí a checkboxu uložíme je do záznamu, který up­ravujeme.

Shrnutí

  1. Ukázali jsme si, jak vytvořit novou ob­razov­ku, jak ji vyvolat a jak předat para­met­ry spuštění.

  2. Naučili jsme se vyvolat novou ob­razov­ku pomocí třídy Intent.

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