NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Lekce 4 - Android AlertDialog - Výběr jedné položky ze seznamu

V minulé části, Android AlertDialog - Ikona v hlavičce, jsme si do hlavičky našeho dialogového okna připravili a přidali ikonu. Také jsme si doplnili znalosti o zavírání dialogového okna a ukázali jsme, jak jej můžeme zavřít pomocí Java kódu.

Ne na každou otázku lze odpovědět způsobem Ano/Ne. V dnešním Android tutoriálu si proto ukážeme, jak pomocí dialogového okna uživateli nabídnout výběr z většího počtu možných odpovědí zobrazených v seznamu.

Výběr položky ze seznamu

Existují tři způsoby výběru ze seznamu zobrazeného v dialogovém okně typu AlertDialog:

  • výběr jedné položky s automatickým zavřením dialogového okna,
  • výběr jedné položky s nutností výběr potvrdit tlačítkem,
  • výběr více než jedné položky.

Dnes si ukážeme první z uvedených způsobů. Uživateli umožníme vybrat pouze jednu možnost. Po výběru se dialogové okno automaticky zavře.

Doplnění ukázkového projektu

Abychom si popsané vyzkoušeli v praxi, doplníme projekt naší ukázkové aplikace o druhý příklad. Hlavní aktivitu doplníme o nové tlačítko, kterým budeme zobrazovat AlertDialog se seznamem.

Soubor activity_main.xml

Nejprve doplníme XML návrh vzhledu hlavní aktivity o jedno tlačítko:

<Button
    android:id="@+id/btn_autoclose_list_dialog"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Výběr jedné položky z nabídky"
    android:textAllCaps="false" />

Na následujícím obrázku máme vzhled hlavní aktivity s přidaným druhým tlačítkem:

doplnění tlačítka na úvodní obrazovce - Dialogová okna v Androidu

Soubor MainActivity.java

Nyní se přesuneme do hlavní aktivity. Otevřeme si soubor MainActivity.java. Zde postupně doplníme nový Java kód.

Proměnné

Pod proměnnou btn_basic_dialog přidáme novou proměnnou btn_autoclose_list_dialog typu Button:

Button btn_autoclose_list_dialog;

Metoda onCreate()

V kódu hlavní aktivity doplníme přepsanou metodu onCreate() o inicializaci proměnné btn_autoclose_list_dialog referencí na nově přidané tlačítko v XML návrhu vzhledu aktivity:

btn_autoclose_list_dialog = findViewById(R.id.btn_autoclose_list_dialog);

btn_autoclose_list_dialog.setOnClickListener(this);

Novému tlačítku dále nastavujeme posluchače události kliknutí. Tímto posluchačem je celá hlavní aktivita, proto budeme muset později doplnit i přepsanou metodu onClick().

Metoda showInfo()

Nyní v souboru MainActivity.java deklarujeme novou metodu showInfo(). Tato metoda bude sloužit k zobrazení textu položky, zvolené z nabídky dialogového okna. K zobrazení textu použijeme Snackbar.

Snackbar umožňuje uživateli na několik vteřin zobrazit krátkou zprávu ve spodní části obrazovky.

Než se pustíme do samotné metody showInfo(), přidáme do souboru res/values/colors.xml novou konstantu barvy textu pro náš Snackbar:

<color name="snackbar_text_color">#C9F8FF</color>

Naše metoda showInfo() bude vypadat takto:

private void showInfo(String text) {
    Snackbar snackbar = Snackbar
            .make(findViewById(android.R.id.content), text, Snackbar.LENGTH_LONG)
            .setTextColor(getResources().getColor(R.color.snackbar_text_color))
            .setAction("Zavřít", new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });
    snackbar.show();
}

Metoda showInfo() přijímá jeden parametr typu String představující textový řetězec, který má být zobrazen. Nejprve vytváříme novou instanci třídy Snackbar, kterou dále nastavujeme. Voláním metody make() pro Snackbar jako zobrazovaný text nastavujeme parametr text, se kterým byla zavolána metoda showInfo(). Posledním parametrem metody make() nastavujeme systémovou konstantou Snackbar.LENGTH_LONG dobu, po kterou bude Snackbar zobrazený.

Metodou setTextColor() nastavujeme barvu zobrazeného textu odkazem na naší konstantu snackbar_text_color ze souboru res/values/colors.xml. Metodou setAction() nastavujeme text tlačítka pro Snackbar a také akci, která bude stisknutím tohoto tlačítka provedena.

Metoda showSingleChoiceList()

Nyní se podíváme na deklaraci naší další nové metody showSingleChoiceList(), která bude volána po stisknutí druhého tlačítka v hlavní aktivitě naší ukázkové aplikace. Tuto metodu deklarujeme v souboru MainActivity.java a bude vypadat takto:

public void showSingleChoiceList() {
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setTitle("Vyber zvíře");

    // !!! Nesmí být nastaven následující zakomentovaný parametr. Jinak nebude seznam zobrazen !!!
    // alertDialogBuilder.setMessage("Zpráva pro uživatele");

    final String[] animals = new String[]{
            "Pes",
            "Kočka",
            "Králík",
            "Slepice",
            "Kráva",
            "Prase",
            "Ovce",
            "Kuna",
            "Jelen",
            "Orel"
    };

    alertDialogBuilder.setItems(animals, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            showInfo(animals[which]);
        }
    });

    alertDialogBuilder.setNeutralButton("Zavřít", null);

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
}

Ve výše uvedené metodě známým způsobem vytváříme nový AlertDialog, kterému následně nastavujeme text v jeho hlavičce. Následuje zakomentovaný řádek s nastavením textu obsahu dialogu. Tento řádek později můžeme zkusit odkomentovat a vyzkoušet si, co se bude dít.

Pokud chceme AlertDialog použít pro zobrazení seznamu, nesmíme dialogu nastavit text metodou setMessage(). Pokud text takto nastavíme, nebude zobrazen seznam položek.

V dalším kroku vytváříme pole textových řetězců animals s názvy zvířat, které v dalším řádku dosazujeme do prvního parametru metody setItems(). Ve druhém parametru této metody vytváříme posluchače události výběru položky ze seznamu.

V přepsané metodě onClick() posluchače voláme naší metodu showInfo(), která zajistí zobrazení vybraného zvířete ve Snackbar okně. Informaci o tom, který textový řetězec byl v seznamu vybrán, získáme z parametru which přepsané metody onClick(). Takto získáme index položky v našem poli se zvířaty, které jsme dialogu nastavili prvním parametrem metody setItems().

Po výběru kterékoliv položky bude dialog automaticky zavřen. Proto není nutné definovat pozitivní tlačítko pro potvrzení volby. Jediné tlačítko, které nastavíme, je neutrální tlačítko pro zavření dialogu bez volby položky. Jeho nastavení máme v dalším řádku metody showSingleChoiceList(). Dále již známým způsobem dokončujeme vytvoření dialogového okna.

Na závěr voláme metodu show(), bez které by vytvořené dialogové okno nemohlo být zobrazeno.

Metoda onClick()

Přestože máme připraveno vše potřebné k zobrazení druhého příkladu v naší ukázkové aplikaci, druhé tlačítko v hlavní aktivitě nebude na stisknutí reagovat. Ještě nám totiž chybí doplnění přepsané metody onClick() v souboru MainActivity.java. V této metodě pouze doplníme konstrukci switch o tuto další možnost:

case R.id.btn_autoclose_list_dialog:
    showSingleChoiceList();
    break;

Ve druhé větvi switch voláme naší metodu showSingleChoiceList(), která zobrazí AlertDialog s naším seznamem zvířat.

Nyní je tedy vše připravené k vyzkoušení druhého příkladu. Aplikaci spustíme a klikneme na nově přidané druhé tlačítko:

náhled nového dialogového okna - Dialogová okna v Androidu

Stisknutím druhého tlačítka je zobrazeno dialogové okno s nabídkou seznamu zvířat. Kliknutím na kteroukoliv položku seznamu je dialogové okno zavřeno a ve spodní části displeje je na několik vteřin zobrazen Snackbar s vybraným zvířetem:

náhled – hlavní menu a Snackbar - Dialogová okna v Androidu

Uložení seznamu do resources

Pole se seznamem zvířat vytváříme až těsně před zobrazením dialogového okna. Existuje ale lepší možnost. Můžeme mít takové pole se seznamem zvířat uložené v resources projektu. Jak na to? Ve složce res/values/ vytvoříme nový soubor, který pojmenujeme například string_array.xml a doplníme ho takto:

<resources>
    <string-array name="zvirata">
        <item>Pes</item>
        <item>Kočka</item>
        <item>Králík</item>
        <item>Slepice</item>
        <item>Kráva</item>
        <item>Prase</item>
        <item>Ovce</item>
        <item>Kuna</item>
        <item>Jelen</item>
        <item>Orel</item>
    </string-array>
</resources>

Vytvořený soubor string_array.xml obsahuje jedno pole textových řetězců pojmenované zvirata.

Na vytvořené pole v resources se v Java kódu odkážeme a vytvoříme z něj klasické pole textových řetězců takto:

String[] animals = getResources().getStringArray(R.array.zvirata);

Pod článkem je opět k dispozici ke stažení archiv s doplněným projektem naší ukázkové aplikace.

V příští lekci, Android AlertDialog - Výběr ze seznamu s potvrzením, naší ukázkovou aplikaci doplníme o další příklad dialogového okna. Vytvoříme seznam, ze kterého bude moci uživatel vybrat jen jednu položku a výběr bude muset potvrdit pozitivním tlačítkem.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 4x (23.27 MB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Android AlertDialog - Ikona v hlavičce
Všechny články v sekci
Dialogová okna v Androidu
Přeskočit článek
(nedoporučujeme)
Android AlertDialog - Výběr ze seznamu s potvrzením
Článek pro vás napsal Pavel
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity