KAPITOLA 7. Widgety nabídek. V této kapitole:

Podobné dokumenty
Začínáme s vývojem pro Android

Obsah. Menu. ListView ListActivity Adapter. Ikonkové Rozšířené Submenu Kontextové. BaseAdapter ArrayAdapter CursorAdapter SimpleCursorAdapter 11/29/11

(c) Miroslav Balík, Ondřej Kroupa, Martin Pelant 11/29/ přednáška. Android projekt. Manifest. Activity. Uživatelské rozhraní (základy)

1 Tabulky Příklad 3 Access 2010

1. Umístěte kurzor do sloupce Datový typ na řádek s polem, ve kterém vytvořit chcete seznam.

Formuláře. Téma 3.2. Řešený příklad č Zadání: V databázi formulare_a_sestavy.accdb vytvořte formulář pro tabulku student.

Obsah. LayoutInflater. UI model KeyEvent View Tvorba vlastních komponent Canvas Matrix Vlastní EditText

3 Formuláře a sestavy Příklad 1 Access 2007

Vizualizace a evidence výroby a prostojů

5. LISTVIEW BI-AND. Programování pro operační systém Android (BI-AND) (c) Autor a garant: M. Havryluk, Spolupráce: M. Balík, O. Kroupa, M.

Studijní skupiny. 1. Spuštění modulu Studijní skupiny

Zadání pro kategorii Tvorba webu

Aplikace Capture Pro. Referenční příručka. A-61640_cs

Úvod do filtrace, Quick filtr

KMI / TMA Tvorba mobilních aplikací. 9. seminář ZS 2016/2017 Středa 13:15-15:45

Ovládání Open Office.org Calc Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako.

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 6. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

Uživatelská příručka k systému Jídelna inet

Uživatelské rozhraní. Layouty FrameLayout LinearLayout RelativeLayout TableLayout ScrollView Taby Dialogy ViewFlipper 11/29/11

Up & Down Opce. Manuál. Obsah

2 PŘÍKLAD IMPORTU ZATÍŽENÍ Z XML

KMI / TMA. Tvorba mobilních aplikací. 3. seminář ZS 2017/2018 ČTVRTEK 13:15-15:45

Modul Statistika poskytuje přehled o počtu studentů na fakultách, v jednotlivých programech, oborech, apod.

Úvodem 17. Začínáme 21. Výzvy vývoje aplikací pro chytré telefony 22 Z čeho se aplikace pro systém Android skládají 23 Co máte k dispozici 24

Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý

T-Mobile Internet. Manager. pro Mac OS X NÁVOD PRO UŽIVATELE

Prohlížení a editace externích předmětů

43 HTML šablony. Záložka Šablony v systému

Reliance 3 design OBSAH

Pracovní prostředí Excel 2010

PRÁCE S APLIKACÍ Evidence městských knih

Up & Down opce. Manuál. Obsah

Podrobný návod pro administraci zákaznických účtů na portálu Czechiatour.eu

KMI / TMA Tvorba mobilních aplikací. 3. seminář ZS 2016/2017 Středa 13:15-15:45

Rámcový návod pro školitele. doktorských studijních programů

Obsah. Úvod 11. Vytvoření emulátoru 20 Vytvoření emulátoru platformy Android 4.4 Wearable 22 Spouštění aplikací na reálném zařízení 23

Prozkoumání příkazů na pásu karet Každá karta na pásu karet obsahuje skupiny a každá skupina obsahuje sadu souvisejících příkazů.

ZŠ ÚnO, Bratří Čapků 1332

Sestavy. Téma 3.3. Řešený příklad č Zadání: V databázi zkevidence.accdb vytvořte sestavu, odpovídající níže uvedenému obrázku.

Kontingenční tabulky v MS Excel 2010

Zemětřesení a sopečná činnost

Návod k použití programu Business Plan

Strategie ochrany před negativními dopady povodní a erozními jevy přírodě blízkými opatřeními v České republice

3 Formuláře a sestavy Příklad 1 Access 2010

Formátování pomocí stylů

DATABÁZE MS ACCESS 2010

Kontakty Upravení kontaktu - změna údájů Přidání fotky ke kontaktu Založení nového kontaktu Kopírování ze SIM karty do telefonu Základní nastavení

Přehledy pro Tabulky Hlavním smyslem této nové agendy je jednoduché řazení, filtrování a seskupování dle libovolných sloupců.

47 Mapování přístupnosti

15. Projekt Kalkulačka

PRACUJEME S TSRM. Modul Samoobsluha

AutoCAD definice bloku

UniLog-D. v1.01 návod k obsluze software. Strana 1

Externí spolupracovníci


MONITORING OBCHODNÍCH PARTNERŮ

Informační manuál ZVEŘEJŇOVÁNÍ STUDIJNÍCH MATERIÁLŮ PROSTŘEDNICTVÍM PORTÁLU STUDENT.CZU.CZ

Popis a ovládání. Aplikace 602XML Filler

D2 - GUI design. Radek Mečiar

VYTVÁŘENÍ DATABÁZÍ, VKLÁDÁNÍ ÚDAJŮ

Návod k ovládání aplikace

2011 Všechna práva vyhrazena. Stručné pokyny k zařízení Acer ICONIA TAB Model: A500/A501 Původní vydání: 4/2011. Acer ICONIA TAB.

STAVEBNÍ KNIHOVNA DEK. Manuál k programu. Verze 2019_08_09

FORMÁTOVÁNÍ 2. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

Příručka uživatele systému Museion. Quick filtr

VAŠE NOVÁ APLIKACE NISSAN GROUP EPC PŘÍRUČKA ZAČÍNÁME

KMI / TMA Tvorba mobilních aplikací. 6. seminář ZS 2016/2017 Středa 13:15-15:45

Projekt Obrázek strana 135

Registrace a nastavení účtů do Vodafone OneNet Samoobsluhy, Vodafone evyúčtování.

Word Lekce III. a IV.

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Rollei Historyline 98. Používání funkce Wi-FI

Příručka uživatele HELPDESK GEOVAP

Osnova. Koncept a použití prezentací. Seznámení s pracovním prostředím MS Word Režimy zobrazení. Užitečná nastavení. Základní práce s dokumenty

Internetový přístup do databáze FADN CZ - uživatelská příručka Modul FADN RESEARCH / DATA

Dotykova obrazovka v programu TRIFID

20. Projekt Domácí mediotéka

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 2. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

SPRÁVA STÁTNÍCH HMOTNÝCH REZERV

RELAČNÍ DATABÁZE ACCESS

TouchGuard Online pochůzkový systém

HLEDEJCENY.mobi. Obsah. Mobilní verze e-shopu. Důvody instalace

2. Rozbalení Laser Interceptor Bluetooth modulu (LI BTM)

DATABÁZE A SYSTÉMY PRO UCHOVÁNÍ DAT 61 DATABÁZE - ACCESS. (příprava k vykonání testu ECDL Modul 5 Databáze a systémy pro zpracování dat)

MANUÁL K OBSLUZE REDAKČNÍHO SYSTÉMU / wordpress

Výčtový typ strana 67

WORKWATCH ON-LINE EVIDENCE PRÁCE A ZAKÁZEK

Souhrn výukových materiálů ke kurzu: Tvorba výukových materiálů pomocí tabletu (B3.6)

Použití prezentací. K heslovitému sdělení informací. Oživení obrázky, schématy, tabulkami, Nevhodné pro dlouhé texty. Doprovodná pomůcka při výkladu

MANUÁL K AGENDĚ SPEDICE PŘÍRUČKA PRO UŽIVATELE

Java a XML. 10/26/09 1/7 Java a XML

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Sentech AL 7000 C. Instalace a ovládání programu BREATH

Manuál k redakčnímu systému

Tiskový manažer - Printman

NÁVOD NA OBSLUHU INTERNETOVÉ PREZENTACE. Ataxo Czech s.r.o.

Tiskové sestavy. Zdroj záznamu pro tiskovou sestavu. Průvodce sestavou. Použití databází

Začínáme. 1 Nabijte přístroj připojením do síťové zásuvky. Pro nabíjení a přenos dat můžete připojit Kindle pomocí USB kabelu do Vašeho počítače

Tisk vysvědčení pro třídní učitele

Transkript:

KAPITOLA 7 Widgety nabídek V této kapitole: Přizpůsobení se okolnostem Výčty nabídek Rozbalovací menu Mřížka nabídek O 35 % méně psaní na klávesnici při práci s textovými poli Galerie

74 Kapitola 7: Widgety nabídek V 5. kapitole jste se dočetli, jak lze na textová pole aplikovat omezení specifikující formát dat, která do nich lze vložit například pouze čísla. Tento druh omezení pomáhá uživateli vložit do pole data ve správném formátu, a to zejména na mobilních zařízeních s maličkou klávesnicí. Omezit pak lze samozřejmě i výběr z určité množiny položek, například ze skupiny přepínačů (popis skupiny přepínačů najdete také v 5. kapitole). Klasické sady nástrojů pro tvorbu uživatelského rozhraní za tímto účelem nabízejí výčty, rozbalovací výčty, drop-down menu a podobné ovládací prvky. Android podporuje mnoho stejných druhů widgetů a navíc ještě některé zvláštní druhy, které se hodí zejména pro použití na mobilním zařízení (například třídu Gallery pro prohlížení uložených fotografií). Kromě toho Android nabízí také flexibilní prostředí pro určení položek, z nichž lze prostřednictvím těchto widgetů vybírat. Konkrétně se jedná o prostředí datových adaptérů, které zajišťují společné rozhraní pro výčty nabídek a umí nabídkám dodat data z nejrůznějších zdrojů, od statických polí až po obsah databází. Náhledy nabídek widgety pro prezentaci výčtu možností tedy mají svůj adaptér, který jim dodává jejich obsah. Na začátku této kapitoly se nejprve společně podíváme na adaptéry systému Android a poté si řekneme více o widgetech nabídek. Přizpůsobení se okolnostem Z teoretického hlediska adaptéry zajišťují společné rozhraní pro více různých nesourodých API. V případě systému Android se pak konkrétněji jedná o zajištění společného rozhraní pro datový model, který stojí za widgety nabídek, jako je například výčet. Tento způsob využití Java rozhraní je běžný (viz například Java/Swing adaptéry pro třídu JTable) a Java není jediným prostředím, které tento druh abstrakce nabízí (XML data-binding prostředí jazyka Flex například přijímá XML dokumenty v inline podobě nebo stažené z Internetu). Adaptéry systému Android jsou zodpovědné za dodávání soupisu dat widgetům nabídek a za konvertování jednotlivých datových položek na specifické náhledy, které se ve widgetech nabídek zobrazují. Tato druhá funkce systému adaptérů vám možná připadá poněkud zvláštní, ale ve skutečnosti se příliš neliší od způsobů, kterými nahrazují výchozí zobrazovací chování i jiné sady nástrojů pro tvorbu uživatelského rozhraní. Pokud například chcete v jazyce Java nebo Swing konvertovat výčet založený na třídě JList na výčet se zaškrtnutelnými políčky, skončíte nevyhnutelně u volání metody setcellrenderer(), abyste mohli dodat vaši vlastní instanci třídy ListCellRenderer, která pak konvertuje řetězce výčtu na složené widgety tvořené instancemi tříd JCheckBox a JLabel. Nejjednodušší je práce s adaptérem typu ArrayAdapter. Stačí, když obalíte jeho instancí Java pole nebo instanci typu java.util.list, a máte plně funkční adaptér: String[] items={"tohle", "je", "vážně", "hodně", "podivný", "výčet"; new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, items); Konstruktor třídy ArrayAdapter přijímá tři parametry: Kontext (instanci třídy Context), který se má použít (to bude obvykle instance vaší aktivity). ID prostředku náhledu, který se má použít (například ID prostředku zabudovaného do systému, jako v předchozím příkladu). Samotné pole nebo výčet položek, které se mají zobrazit.

Výčty nabídek 75 Ve výchozím nastavení zavolá třída ArrayAdapter pro objekty na výčtu metodu tostring()a obalí každý z řetězců náhledem dodaným jako prostředek. android.r.layout.simple_list_item_1 jednoduše konvertuje tyto řetězce na objekty typu TextView. Tyto widgety typu TextView se následně zobrazí na výčtu, v rozbalovacím menu nebo jakémkoliv jiném widgetu, který tento adaptér typu ArrayAdapter používá. V kapitole 8 se dočtete, jak vytvořit podtřídu třídy Adapter a nahradit operaci vytvoření řádku tak, abyste měli větší kontrolu nad jeho výslednou podobou. Zde jsou další dva adaptéry systému Android, které by se vám mohly hodit: CursorAdapter: Konvertuje instanci třídy Cursor, obvykle dodanou dodavatelem obsahu, na něco, co lze zobrazit v náhledu nabídky. (Podrobnější rozbor třídy CursorAdapter najdete v kapitole 22, která je věnovaná databázím.) SimpleAdapter: Konvertuje data nalezená v XML prostředcích. Výčty nabídek Klasický widget výčtu nabídek je v systému Android třídy ListView. Vložte instanci této třídy do vašeho návrhu, zavolejte metodu setadapter(), abyste jí dodali data a náhledy, které budou jejími potomky, přidělte posluchač prostřednictvím metody setonitemselectedlistener(), abyste byli upozorněni na provedenou volbu, a máte plně funkční výčet nabídek. Avšak tvoří-li vaši aktivitu jediný výčet nabídek, můžete také zvážit její vytvoření jako podtřídy třídy ListActivity místo podtřídy obvyklé základní třídy Activity. Pokud je váš hlavní náhled pouhým výčtem, nemusíte dokonce ani dodat jeho návrh; třída ListActivity pro vás zkonstruuje výčet přes celou obrazovku. Chcete-li jeho podobu upravit, můžete to udělat, pokud svoji instanci třídy ListView identifikujete jako @android:id/list, aby třída ListActivity věděla, který widget je hlavním výčtem aktivity. Zde je jednoduchý příklad výčtu a jednoho popisku zobrazujícího aktuální volbu, který najdete ve složce vzorového projektu Selection/List: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <TextView android:id="@+id/selection" android:layout_height="wrap_content"/> <ListView android:id="@android:id/list" android:layout_height="fill_parent" android:drawselectorontop="false" /> </LinearLayout> A zde je zdrojový kód jazyka Java, který konfiguruje výčet a propojuje jej s popiskem: public class ListViewDemo extends ListActivity { TextView selection; String[] items={"lorem", "ipsum", "dolor", "sit", "amet",

76 Kapitola 7: Widgety nabídek "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"; @Override public void oncreate(bundle icicle) { super.oncreate(icicle); setcontentview(r.layout.main); setlistadapter(new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, items)); selection=(textview)findviewbyid(r.id.selection); public void onlistitemclick(listview parent, View v, int position, long id) { selection.settext(items[position]); Odvodíte-li třídu vaší aktivity od třídy ListActivity, můžete nastavit adaptér výčtu prostřednictvím metody setlistadapter() které v tomto případě předáte instanci třídy ArrayAdapter obalující pole řetězců. Abyste zjistili, že se změnil provedený výběr, nahraďte metodu onlistitemclick() a proveďte příslušné kroky na základě dodaného náhledu potomka a pozice na výčtu v tomto případě se jedná o aktualizaci textu popisku textem této pozice. Výsledná aplikace je na obrázku 7.1. Druhý parametr konstruktoru vaší instance třídy ArrayAdapter specifikuje vzhled řádků. Hodnota android.r.layout.simple_list_item_1 tohoto parametru použitá v předchozím příkladu specifikuje standardní řádek výčtu nabídek systému Android: velký font, hodně výplně a bílý text. Obrázek 7.1: Vzorová aplikace ListViewDemo Ve výchozím nastavení instance třídy ListView jednoduše informuje o klepnutí na záznamy ve výčtu. Potřebujete-li použít výčet, který si pamatuje provedený výběr nebo umožňuje výběr více položek najednou, můžete také použít instanci třídy Listview, ale musíte provést několik úprav: Zavolat ve zdrojovém kódu jazyka Java metodu instance třídy ListView setchoicemode() a předat jí jednu z následujících hodnot: CHOICE_MODE_SINGLE, nebo CHOICE_MODE_MULTIPLE. Instanci třídy ListView můžete získat z instance třídy ListActivity prostřednictvím volání její metody getlistview(). Místo toho, abyste specifikovali podobu řádků na výčtu prostřednictvím hodnoty android. R.layout.simple_list_item_1, použijte buď hodnotu android.r.layout.simple_ list_item_single_choice pro výběr jediného řádku (viz obrázek 7.2), nebo android. R.layout.simple_list_item_multiple_choice pro výběr více různých řádků najednou (viz obrázek 7.3). Chcete-li určit, které řádky uživatel zaškrtnul, zavolejte metodu getcheckeditempositions() vaší instance třídy ListView.

Rozbalovací menu 77 Obrázek 7.2: Výběr jediného řádku Obrázek 7.3: Výběr více řádků najednou Rozbalovací menu Třída Spinner je v systému Android ekvivalentem rozbalovacího menu, které najdete i v jiných sadách nástrojů pro tvorbu uživatelského rozhraní (například třída ComboBox v sadě nástrojů Swing pro tvorbu uživatelského rozhraní pro Java aplikace). Stisknete-li prostřední tlačítko na směrovém ovladači telefonu, menu se rozbalí a uživatel z něj může vybrat nějakou položku. Získáte tak v zásadě možnost výběru z výčtu možností, aniž byste zabrali celou obrazovku instancí třídy ListView, avšak za cenu dalšího klepnutí či poklepání na obrazovku. Stejně jako v případě třídy ListView, i instancím třídy Spinner dodáváte adaptér pro jejich data a náhledy potomků prostřednictvím metody setadapter a prostřednictvím metody setonitem SelectedListener() přiřazujete objekt posluchače, který bude upozorněn na provedenou změnu. Chcete-li si ušít náhled používaný při zobrazování rozbaleného menu na míru, musíte nastavit adaptér, a ne widget typu Spinner. Pro dodání ID prostředku náhledu, který se má použít, použijte metodu setdropdownviewresource(). Zde je jednoduchý příklad náhledu s rozbalovacím menu, který najdete ve složce vzorového projektu Selection/Spinner: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <TextView android:id="@+id/selection" android:layout_height="wrap_content" /> <Spinner android:id="@+id/spinner"

78 Kapitola 7: Widgety nabídek android:layout_height="wrap_content" android:drawselectorontop="true" /> </LinearLayout> Jedná se o stejný náhled jako v předchozí sekci, ale tentokrát v něm místo widgetu typu ListView používáte widget typu Spinner. Atribut widgetu typu Spinner, android:drawselectoron Top, specifikuje, zda se na ovládacím tlačítku na pravé straně widgetu vykreslí šipka. Abyste rozbalovací menu zaplnili položkami a mohli jej používat, musíte napsat také nějaký zdrojový kód jazyka Java: public class SpinnerDemo extends Activity implements AdapterView.OnItemSelectedListener { TextView selection; String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"; @Override public void oncreate(bundle icicle) { super.oncreate(icicle); setcontentview(r.layout.main); selection=(textview)findviewbyid(r.id.selection); Spinner spin=(spinner)findviewbyid(r.id.spinner); spin.setonitemselectedlistener(this); ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.r.layout.simple_spinner_item, items); aa.setdropdownviewresource( android.r.layout.simple_spinner_dropdown_item); spin.setadapter(aa); public void onitemselected(adapterview<?> parent, View v, int position, long id) { selection.settext(items[position]); public void onnothingselected(adapterview<?> parent) { selection.settext(""); Zde přiřazujete jako posluchače provedeného výběru samotnou aktivitu (spin.setonitem SelectedListener(this)). To můžete udělat, protože aktivita implementuje rozhraní OnItem SelectedListener. Adaptér nakonfigurujete nejen výčtem řetězců, ale i konkrétním prostředkem, který má pro náhled rozbalovacího menu používat (prostřednictvím metody aa.setdrop DownViewResource()). Všimněte si také použití hodnoty android.r.layout.simple_ spinner_item, specifikující zabudovaný náhled pro zobrazování položek menu.

Mřížka nabídek 79 Nakonec implementujete callback metody vyžadované rozhraním OnItemSelectedListener pro nastavení popisku, který reflektuje provedený výběr. Výsledná aplikace je na obrázcích 7.4 a 7.5. Obrázek 7.4: Vzorová aplikace SpinnerDemo po spuštění Obrázek 7.5: Vzorová aplikace SpinnerDemo s rozbaleným menu Mřížka nabídek Jak již napovídá název jeho třídy, widget typu GridView vám dodává dvoudimenzionální mřížku položek, ze kterých si může uživatel vybrat. Zároveň máte možnost určité kontroly nad počtem a rozměry jejích sloupců; počet řádků se určuje dynamicky na základě počtu položek, které dodaný adaptér specifikuje jako zobrazitelné. Počet sloupců a jejich rozměry specifikuje kombinace několika atributů: android:numcolumns: Specifikuje počet sloupců, anebo, pokud tento atribut nastavíte na hodnotu auto_fit, že má vypočítat počet sloupců na základě volného místa na obrazovce a hodnot následujících atributů systému. android:verticalspacing a android:horizontalspacing: Specifikuje mezery mezi jednotlivými položkami v mřížce. android:columnwidth: Specifikuje šířku sloupců v pixelech. android:stretchmode: Specifikuje pro mřížky s hodnotou atributu android:numcolumns auto_fit, jak se má naložit s volným místem, které není zabrané sloupci nebo mezerami. Tento atribut může mít hodnotu columnwidth, která specifikuje, že mají volné místo zabrat sloupce, nebo spacingwidth, která specifikuje, že mají volné místo zabrat mezery mezi sloupci. Představte si například, že má displej 320 pixelů na šířku a vy máte atribut android:columnwidth nastavený na hodnotu 100px a atribut android:horizontalspacing na hodnotu 5px. Tři sloupce zaberou 310 pixelů (tři sloupce po 100 pixelech a dvě mezery po 5 pixelech). Nastavíte-li atribut android:stretchmode na hodnotu columnwidth, roztáhnou se všechny tři sloupce o 3 až 4 pixe-

80 Kapitola 7: Widgety nabídek ly, aby využily zbývajících 10 pixelů. Nastavíte-li atribut android:stretchmode na hodnotu spacingwidth, roztáhnou se o 5 pixelů a zaberou tak zbývající volné místo obě mezery. Jinak funguje widget typu GridView v podstatě stejně jako jakýkoliv jiný widget nabídky: používá metodu setadapter() k dodání dat a náhledů potomků, metodu setonitemselectedlistener() k registraci posluchačů výběru atd. Zde je jednoduchý příklad XML návrhu, který najdete ve složce vzorového projektu Selection/ Grid, demonstrující konfiguraci widgetu typu GridView: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <TextView android:id="@+id/selection" android:layout_height="wrap_content" /> <GridView android:id="@+id/grid" android:layout_height="fill_parent" android:verticalspacing="35px" android:horizontalspacing="5px" android:numcolumns="auto_fit" android:columnwidth="100px" android:stretchmode="columnwidth" android:gravity="center" /> </LinearLayout> Tato mřížka zabírá celou obrazovku kromě místa potřebného pro popisek reflektující provedený výběr. Počet sloupců mřížky počítá systém (android:numcolumns = "auto_fit") na základě rozměru horizontálních mezer 5 pixelů (android:horizontalspacing = "5px") a šířky sloupců 100 pixelů (android:columnwidth = "100px"). Sloupce pak absorbují jakékoliv zbytky volného prostoru v horizontálním směru (android:stretchmode = "columnwidth"). Zdrojový kód jazyka Java potřebný k nakonfigurování mřížky vypadá takto: public class GridDemo extends Activity implements AdapterView.OnItemSelectedListener { TextView selection; String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"; @Override public void oncreate(bundle icicle) { super.oncreate(icicle);

Mřížka nabídek 81 setcontentview(r.layout.main); selection=(textview)findviewbyid(r.id.selection); GridView g=(gridview) findviewbyid(r.id.grid); g.setadapter(new FunnyLookingAdapter(this, android.r.layout.simple_list_item_1, items)); g.setonitemselectedlistener(this); public void onitemselected(adapterview<?> parent, View v, int position, long id) { selection.settext(items[position]); public void onnothingselected(adapterview<?> parent) { selection.settext(""); private class FunnyLookingAdapter extends ArrayAdapter { Context ctxt; FunnyLookingAdapter(Context ctxt, int resource, String[] items) { super(ctxt, resource, items); this.ctxt=ctxt; public View getview(int position, View convertview, ViewGroup parent) { TextView label=(textview)convertview; if (convertview==null) { convertview=new TextView(ctxt); label=(textview)convertview; label.settext(items[position]); return(convertview); Tentokrát používáte pro buňky mřížky místo automaticky generovaných widgetů typu TextView jako v předchozích náhledech vaše vlastní náhledy tak, že vytváříte podtřídu třídy ArrayAdapter a nahrazujete metodu getview(). V tomto případě obalujete řetězce do vašich vlastních widgetů typu TextView, aby vypadaly trochu jinak. Pokud metoda getview obdrží instanci třídy TextView, pouze resetujete její text; jinak vytvoříte novou instanci třídy TextView a zaplníte ji. S vertikálními mezerami o šířce 35 pixelů nastavenými XML souboru návrhu (android:vertical Spacing ="35") mřížka přesahuje hranice obrazovky emulátoru viz obrázky 7.6 a 7.7.

82 Kapitola 7: Widgety nabídek Obrázek 7.6: Vzorová aplikace GridDemo po spuštění Obrázek 7.7: Vzorová aplikace GridDemo zobrazující spodní část mřížky O 35 % méně psaní na klávesnici při práci s textovými poli Třída AutoCompleteTextView je jakýmsi hybridem mezi třídou EditText (textové pole) a Spinner (rozbalovací menu). Díky nástroji pro automatické dokončování zadávaného textu se s zadávaným textem nakládá jako s filtrem předpon a text se porovnává s výčtem možných kandidátů. Nalezené kandidáty (řetězce znaků), které začínají písmeny shodujícími se se zadávaným řetězcem, se rozbalují v menu směrem dolů z textového pole, stejně jako v případě rozbalovacího menu. Uživatel pak buď může dokončit zadávání vstupu na klávesnici (například řetězce, který není na výčtu), anebo vybrat odpovídající položku z rozbaleného menu a nastavit ji tak jako hodnotu textového pole. Třída AutoCompleteTextView je podtřídou třídy EditText, takže můžete nastavit všechny standardní vizuální a ovládací vlastnosti widgetu, například jeho font a barvu. Kromě těchto atributů má třída AutoCompleteTextView ještě vlastnost android:completionthreshold, jejíž hodnota specifikuje minimální počet znaků, které musí uživatel zadat, než se zahájí filtrování nabídky kandidátů. Widgetu typu AutoCompleteTextView můžete prostřednictvím metody setadapter() přidělit adaptér obsahující výčet hodnot kandidátů. Avšak protože uživatel může zadat hodnotu, která na výčtu kandidátů není, nepodporuje třída AutoCompleteTextView posluchače provedeného výběru. Místo toho můžete stejně jako v případě jakéhokoliv jiného widgetu typu EditText zaregistrovat rozhraní TextWatcher, které vás upozorní na změnu obsahu textového pole. Tato událost je pak buď výsledkem ručně vloženého vstupu, nebo výběru z rozbalovací nabídky kandidátů. Následující povědomý XML návrh tentokrát obsahuje definici widgetu typu AutoComplete TextView (najdete jej ve složce vzorové aplikace Selection/AutoComplete):

O 35 % méně psaní na klávesnici při práci s textovými poli 83 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <TextView android:id="@+id/selection" android:layout_height="wrap_content" /> <AutoCompleteTextView android:id="@+id/edit" android:layout_height="wrap_content" android:completionthreshold="3"/> </LinearLayout> Příslušný zdrojový kód vypadá takto: public class AutoCompleteDemo extends Activity implements TextWatcher { TextView selection; AutoCompleteTextView edit; String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"; @Override public void oncreate(bundle icicle) { super.oncreate(icicle); setcontentview(r.layout.main); selection=(textview)findviewbyid(r.id.selection); edit=(autocompletetextview)findviewbyid(r.id.edit); edit.addtextchangedlistener(this); edit.setadapter(new ArrayAdapter<String>(this, android.r.layout.simple_dropdown_item_1line, items)); public void ontextchanged(charsequence s, int start, int before, int count) { selection.settext(edit.gettext()); public void beforetextchanged(charsequence s, int start, int count, int after) { // potřeba kvůli rozhraní, ale nepoužívá se

84 Kapitola 7: Widgety nabídek public void aftertextchanged(editable s) { // potřeba kvůli rozhraní, ale nepoužívá se Vaše aktivita tentokrát implementuje rozhraní TextWatcher, což znamená, že vaše zpětná volání představují metody ontextchanged() a beforetextchanged(). V tomto případě vás zajímá pouze ta první, ve které aktualizujete popisek reprezentující provedený výběr tak, aby odpovídal aktuálnímu obsahu widgetu typu AutoCompleteTextView. Výsledná aplikace je na obrázcích 7.8, 7.9 a 7.10. Obrázek 7.8: Vzorová aplikace AutoCompleteDemo po spuštění Obrázek 7.9: Stejná aplikace po zadání několika prvních písmen, která odpovídají nějakému kandidátu, zobrazující rozbalovací menu využívající nástroj pro automatické dokončování vkládaného textu Galerie Widget typu Gallery obvykle v sadách nástrojů pro tvorbu uživatelského rozhraní nenajdete. Ve skutečnosti se totiž jedná o horizontálně uložený výčet nabídek. Jedna položka výčtu leží vedle druhé v horizontální ose a aktuálně vybraná položka je zvýrazněná. V systému Android pak uživatelé položkami procházejí prostřednictvím tlačítek vlevo a vpravo na směrovém ovladači. Ve srovnání s widgetem typu ListView zabírá widget typu Gallery méně prostoru na obrazovce, a přesto zobrazuje v jednu chvíli více různých položek (za předpokladu že mají odpovídající rozměry). Ve srovnání s rozbalovacím menu pak galerie vždy zobrazuje více než jednu položku. Typický příkladem použití widgetu typu Gallery je náhled kolekce obrázků. Předáte-li widgetu typu Gallery kolekci fotografií nebo ikon, widget zobrazí jejich náhledy a umožní uživateli, aby si některý z nich vybral.

Galerie 85 Obrázek 7.10: Stejná aplikace po vybrání kandidátu Z hlediska zdrojového kódu funguje galerie velmi podobně jako rozbalovací menu nebo mřížka. Ve své XML návrhu pak můžete pro galerii použít několik atributů: android:spacing: Specifikuje počet pixelů mezi záznamy na výčtu. android:spinnerselector: Specifikuje způsob označení provedeného výběru. Může se jednat buď o odkaz na instanci typu Drawable (viz 20. kapitola), nebo o RGB hodnotu ve formátu #AARRGGBB nebo jiném podobném formátu. android:drawselectorontop: Specifikuje, zda se má selektor označující provedený výběr (nebo odkaz na Drawable) zobrazit před (false), anebo po (true) zobrazení vybraného potomka. Zvolíte-li hodnotu true, ujistěte se, že je váš selektor dostatečně transparentní na to, aby za ním byl zobrazovaný potomek vidět; jinak uživatel vybranou položku neuvidí.