Lekce 2 - Android AlertDialog - Defaultní tlačítka
V minulé části, Android AlertDialog - Základní systémové dialogové okno, jsme si představili dialogová okna a založili nový projekt ukázkové aplikace. Také jsme vytvořili naše první jednoduché dialogové okno.
V dnešním Androiod tutoriálu budeme pokračovat v popisu
dialogového okna typu AlertDialog
. Naším dnešním úkolem bude
přidání a nastavení systémových tlačítek do našeho
prvního dialogového okna, které jsme dříve vytvořili.
Přidání tlačítek systémovému oknu
Náš AlertDialog
, který máme z dřívějška rozpracovaný,
dnes doplníme tlačítky. AlertDialog
může být buď úplně
bez tlačítek, jak jsme si dříve ukázali, nebo
může obsahovat až tři defaultní tlačítka. Android tato
tři tlačítka pojmenovává jako pozitivní tlačítko,
negativní tlačítko a neutrální
tlačítko. Každému z tlačítek zvlášť nastavujeme jeho text a
definujeme obslužný kód události kliknutí. Po stisknutí
kteréhokoliv tlačítka je dialog automaticky zavřen.
Vzhled základních tlačítek nemůžeme, kromě jeho textu, nijak ovlivnit. Je totiž určen konkrétní verzí systému Android na konkrétním zařízení, na kterém aplikace právě běží. Možnosti vytváření vlastních tlačítek si ukážeme až později.
Pro přidání zmíněných tlačítek doplníme naší metodu
showMyAlert()
:
public void showMyAlert() { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); // Nastavení textu titulku alertDialogBuilder.setTitle("Titulek"); // Nastavení textu obsahu alertDialogBuilder.setMessage("Máte velký hlad?"); // Nastavení tlačítek alertDialogBuilder.setPositiveButton("Ano", null); alertDialogBuilder.setNegativeButton("Ne", null); alertDialogBuilder.setNeutralButton("Zavřít", null); // Vytvoření a zobrazení dialogového okna AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); }
Metoda showMyAlert()
nyní bude zobrazovat dialog se třemi
tlačítky, díky kterým bude mít uživatel tři možnosti reakce na
zobrazenou informaci. Těmi možnostmi jsou volby Ano, Ne a
Zavřít. Všechny tři metody setPositiveButton()
,
setNegativeButton()
a setNeutralButton()
přijímají
dva parametry. Do prvního parametru zadáváme textový řetězec s textem
tlačítka. Do druhého parametru zadáváme referenci na posluchače události
kliknutí. My zatím žádného posluchače nedefinujeme, proto zde dosazujeme
hodnotu null
.
I přes to, že není definován posluchač události kliknutí,
bude AlertDialog
po stisknutí kteréhokoliv tlačítka
zavřen.
Po spuštění naší ukázkové aplikace a po zobrazení našeho dialogového okna uvidíme výsledek úpravy:
Události způsobené reakcí uživatele
Nyní si popíšeme, jak můžeme v Java kódu zpracovat reakci uživatele na zobrazeném dialogu. Po zobrazení dialogového okna aplikace čeká na reakci uživatele, který může vyvolat událost:
- obsluhou jednoho z jeho tlačítek,
- výběrem ze seznamu předdefinovaných možností nebo
- zavřením dialogu jinak než jeho tlačítkem.
Výběr ze seznamu předdefinovaných možností si ukážeme později v samostatném příkladu. Dnes se budeme soustředit pouze na tlačítka dialogového okna.
Obsluha tlačítek
Pro ošetření události kliknutí na tlačítka
dialogového okna uživatelem potřebujeme vytvořit posluchače, který na
stisk tlačítka zareaguje provedením nějakého kódu. Tohoto posluchače
dosazujeme do druhého parametru metod setPositiveButton()
,
setNegativeButton()
a setNeutralButton()
. Posluchače
deklarujeme přímo v parametru inline zápisem anonymní třídou nebo
dosazením reference na dříve vytvořeného posluchače.
Vytvoření posluchače inline zápisem
První způsob je pohodlnější, protože nám jeho deklaraci vývojové prostředí Android Studio vygeneruje samo po využití nabídky našeptávače:
Výše uvedený obrázek zobrazuje zapsání klíčového slovo
new
do parametru určeného pro posluchače, na což Android Studio
zareaguje zobrazením nabídky k vygenerování potřebného Java kódu. Takto
budeme postupovat u všech tří metod pro nastavení tlačítek, dokud
nezískáme tento kód:
alertDialogBuilder.setPositiveButton("Ano", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int which) { // Obslužný kód } }); alertDialogBuilder.setNegativeButton("Ne", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int which) { // Obslužný kód } }); alertDialogBuilder.setNeutralButton("Zavřít", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int which) { // Obslužný kód } });
Ve všech třech případech je přepsána metoda onClick()
rozhraní DialogInterface.OnClickListener
. Pokud bude přepsaná
metoda onClick()
obsahovat nějaký kód, bude po stisknutí
daného tlačítka proveden. Kromě toho způsobí stisknutí kteréhokoliv z
těchto tlačítek automatické zavření dialogového okna
.
Deklarace univerzálního posluchače pro více tlačítek
Deklarací univerzálního posluchače vytvoříme instanci rozhraní
DialogInterface.OnClickListener
, kterou dosadíme do druhého
parametru metod setPositiveButton()
,
setNegativeButton()
a setNeutralButton()
. Deklaraci
takového posluchače si přidáme do úvodu třídy MainActivity
pod naší proměnnou btn_basic_dialog
:
DialogInterface.OnClickListener dialogBtnClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: // Obslužný kód break; case DialogInterface.BUTTON_NEGATIVE: // Obslužný kód break; case DialogInterface.BUTTON_NEUTRAL: // Obslužný kód break; } } };
Přepsanou metodu onClick()
rozhraní
DialogInterface.OnClickListener
jsme doplnili konstrukcí
switch
, kde rozlišujeme, jaké tlačítko bylo stisknuto. Každé
tlačítko našeho dialogu při svém stisknutí vrací hodnotu typu
int
, kterou získáme v parametru which
přepsané
metody onClick()
. Tato hodnota slouží k identifikaci
stisknutého tlačítka a může nabývat hodnot jedné z těchto tří
systémových konstant:
DialogInterface.BUTTON_POSITIVE
: -1,DialogInterface.BUTTON_NEGATIVE
: -2,DialogInterface.BUTTON_NEUTRAL
: -3.
Podle konkrétní hodnoty parametru which
můžeme určit
další chování aplikace. Nově vytvořeným posluchačem
dialogBtnClickListener
nyní můžeme nahradit inline zápisy
anonymní třídou na místě druhého parametru metod
setPositiveButton()
, setNegativeButton()
a
setNeutralButton()
:
alertDialogBuilder.setPositiveButton("Ano", dialogBtnClickListener); alertDialogBuilder.setNegativeButton("Ne", dialogBtnClickListener); alertDialogBuilder.setNeutralButton("Zavřít", dialogBtnClickListener);
Zrušení dialogového okna
V předchozím textu jsme si popsali obsluhu události kliknutí na tlačítko. Dále máme možnost odchytit událost zrušení dialogového okna. Uživatel může dialogové okno zrušit dvěma způsoby:
- kliknutím na tlačítko Zpět na svém zařízení nebo
- kliknutím kamkoliv mimo zobrazený dialog.
Chceme-li reagovat na událost zrušení, doplníme
AlertDialog
při jeho vytváření přepisem metody
onCancel()
:
alertDialogBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // Obslužný kód } });
Můžeme také možnost takto zrušit AlertDialog
uživateli
zakázat. V takovém případě bychom použili metodu
setCancelable(false)
.
V případě zakázání možnosti zrušení dialogového okna je nutné zajistit jinou možnost jeho zavření. Například pomocí zobrazeného tlačítka nebo výběrem položky z nabídnutého seznamu. Jinak uživatel nebude mít možnost takové dialogové okno zavřít.
Pod článkem máme k dispozici ke stažení archiv s aktualizovaným projektem naší ukázkové aplikace.
V příští části, Android AlertDialog - Ikona v hlavičce, si do hlavičky našeho dialogového okna
přidáme ikonu z nabídky Asset Studia, jež je součástí Android Studia.
Také si ukážeme možnost zavírání dialogového okna pomocí metody
dismiss()
přímo z Java kódu.
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 (22.96 MB)
Aplikace je včetně zdrojových kódů v jazyce Java