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.

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

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

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

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

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

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

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

4. UŽIVATELSKÉ ROZHRANÍ

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

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

Příklad zobrazení toastu s vlastním designem

VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky Obor Aplikovaná informatika

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Obsah. Životní cyklus activity Context Intent Spouštění aktivit Interakce s uživatelem. Toast. (c) Miroslav Balík, Ondřej Kroupa, Martin Pelant

Teoretické minimum z PJV

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Výčtový typ strana 67

Uživatelská rozhraní 10. cvičení. Martin Němec A

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

typová konverze typová inference

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

JAVA Android Java, letní semestr

3. ŽIVOTNÍ CYKLUS ACTIVITY

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

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

UJO Framework. revoluční architektura beans. verze

XAMARIN 10 PRAKTICKÝCH ZKUŠENOSTÍ. Roman Fischer

KMI / TMA Tvorba mobilních aplikací

Party Navigator PDA Tomáš Kuhn. kompletní dokumentace. Party Navigator. Tomáš Kuhn

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

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

Algoritmy a datové struktury

Autodesk AutoCAD 2018

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

20. Projekt Domácí mediotéka

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Lekce 8 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ

První kapitola úvod do problematiky

JAVA. Real-Time Java

Generické programování

Úvod do programovacích jazyků (Java)

JAVA. Real-Time Java

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Dobré UX jako nejlepší marketingový nástroj mobilních aplikací. Vladimír Korbel

PŘETĚŽOVÁNÍ OPERÁTORŮ

1. Téma 12 - Textové soubory a výjimky

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Datové struktury. alg12 1

Algoritmizace a programování

Android 100% Java telefon. Petr Musil

Programování v C++ 2, 4. cvičení

Typický prvek kolekce pro české řazení

Principy objektově orientovaného programování

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

Jazyk C# (seminář 3)

Obsah. 1. Změny rozměrů a rozlišení. Změna rozměrů v obrazových bodech pro webový výstup. 1. Změny rozměrů a rozlišení. 2. Pravítka, mřížky, vodítka

Android za hranicemi Hello World

Klient Stagu pro Android

Dědičnost (inheritance)

ZÁPADOČESKÁ UNIVERZITA V PLZNI FAKULTA ELEKTROTECHNICKÁ

1. Dědičnost a polymorfismus

ANDROID. Ing. Ladislav Pešička

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Abstraktní třída a rozhraní

IRAE 07/08 Přednáška č. 7. Začátek (head)

Programátorská příručka

Informační Systém pro Psychiatrii HIPPO

Systém KITCHEN MINDER 2 Referenční příručka

Standardní šířka sloupce je průměrná šířka číslic 0-9 standardního písma.

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Abstraktní datové typy: zásobník

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

Seminář Java IV p.1/38

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

OSGi. Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

POČÍTAČOVÁ GRAFIKA. Počítačová grafika 1

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

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

Abclinuxu.cz ITBiz AbcHost 64bit AbcPrace UnixShop Stickfish

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Manuál pro implementaci aplikace Na poštu

Základy objektové orientace I. Únor 2010

Programování v Javě I. Leden 2008

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

GUI. Systémová integrace pro desktopové aplikace

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Rastrová grafika. Grafický objekt je zaznamenán jednotlivými souřadnicemi bodů v mřížce. pixel ( picture element ) s definovanou barvou

Komponenty v.net. Obsah přednášky

Návrhové vzory OMO, LS 2014/2015

Informační Systém PINEL plus

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

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Transkript:

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

9.3.2013 2 Obsah ListView ListActivity Adapter BaseAdapter ArrayAdapter CursorAdapter SimpleCursorAdapter Zásady tvorby uţivatelského rozhraní

9.3.2013 3 ListView Potomek AdapterView View pro zobrazení vertikálního posunovatelného seznamu Poloţkami ListView mohou být i komplikované View Moţnost přidání hlavičky a zápatí addheaderview(view v) addfooterview(view v) Pro práci s ním se pouţívá ListActivity (ale není nutností)

9.3.2013 4 ListActivity Activita obsahující právě jeden ListView Layout musí obsahovat jeden ListView s ID android:id="@android:id/list" Obsahuje ListAdapter Adapter Most mezi AdapterView a zobrazovanými daty Zodpovědný za vytváření View pro kaţdou poloţku datové kolekce Vyuţívá se při vkládání poloţek do ListView, Spinner, ViewPager, AutoCompleteTextView aj.

9.3.2013 5 BaseAdapter Abstraktní třída Základní stavební kámen pro tvorbu vlastních adaptéru ArrayAdapter<T> Generická třída BaseAdapter umoţňující vloţení pole libovolných prvků Pokud není přetíţena metoda getview(), tak se naplňuje pouze jediný TextView

9.3.2013 6 CursorAdapter BaseAdapter pouţívající pro získání dat kurzoru (Cursor) Cursor musí obsahovat sloupec pojmenovaný _id SimpleCursorAdapter Rozdíl mezi SimpleCursorAdapter a CursorAdapter? CursorAdapter mapující sloupce z Cursoru na TextView nebo ImageView definované v XML Na jeden View je moţné přiřadit více hodnot z Cursoru

9.3.2013 7 ListActvity za pouţití ArrayAdapteru public class MyList extends ListActivity { public void oncreate(bundle icicle) { super.oncreate(icicle); String[] names = new String[] { "Linux", "Windows 7", "Eclipse", "Suse", "Ubuntu", "Solaris", "Android", "iphone"}; this.setlistadapter(new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, names)); } @Override protected void onlistitemclick(listview l, View v, int position, long id) { super.onlistitemclick(l, v, position, id); Object o = this.getlistadapter().getitem(position); String keyword = o.tostring(); Toast.makeText(this, "You selected: " + keyword, Toast.LENGTH_LONG).show(); } }

9.3.2013 8 Výsledek ListActivity s ArrayAdapterem

9.3.2013 9 ListActivity s vlastním layoutem poloţky layout/rowlayout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical"> <ImageView android:id="@+id/icon" android:layout_height="wrap_content" android:src="@drawable/icon" android:layout_width="22dp" android:layout_margintop="4dp" android:layout_marginright="4dp" android:layout_marginleft="4dp"> </ImageView> <TextView android:text="@+id/textview01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/label" android:textsize="30dp"></textview> </LinearLayout> rowlayout.xml nastavíme nově vytvořenému adaptéru: this.setlistadapter(new ArrayAdapter<String>(this, R.layout.rowlayout, R.id.label, names));

9.3.2013 10 Výsledek ListActivity s vlastním layoutem poloţky

9.3.2013 11 ConvertView ListView obsahuje vţdy pouze tolik poloţek, kolik je potřeba na displeji Při scrollování jsou jednotlivé View recyklovány Prvky, které nejsou vidět jsou přesunuty do tzv. Recycleru Do metody getview() adapteru se vrací v podobě convertview ConvertView se naplní daty odpovídající poloţky

9.3.2013 12

9.3.2013 13 Holder Pattern Operace findviewbyid() je velmi náročná Volat ji pouze v nezbytných případech Zapamatovat si reference View jednotlivých řádků ViewHolder Drţí reference na View layoutu řádku Přidat referenci ViewHolderu k řádku pomocí metody settag()

9.3.2013 14 Vlastní ArrayAdapter public class MyArrayAdapter extends ArrayAdapter<String> { private final Activity context; private final String[] names; public MyArrayAdapter(Activity context, String[] names) { super(context, R.layout.rowlayout, names); this.context = context; this.names = names; } private class ViewHolder { public ImageView imageview; public TextView textview; } Drţí jednotlivé View vlastního layoutu poloţky a při pouţití View.getTag() není nutné volat časově náročnou operaci findviewbyid(int)

9.3.2013 Vlastní ArrayAdapter - pokračování @Override public View getview(int position, View convertview, ViewGroup parent) { ViewHolder holder; if (convertview == null) { LayoutInflater inflater = context.getlayoutinflater(); convertview = inflater.inflate(r.layout.rowlayout, null, true); holder = new ViewHolder(); holder.textview = (TextView) convertview.findviewbyid(r.id.label); holder.imageview = (ImageView) convertview.findviewbyid(r.id.icon); convertview.settag(holder); } else { holder = (ViewHolder) convertview.gettag(); } holder.textview.settext(getitem(position)); String s = getitem(position); if (s.startswith("windows 7") s.startswith("iphone") s.startswith("solaris")) { holder.imageview.setimageresource(r.drawable.no); } else { holder.imageview.setimageresource(r.drawable.ok); } return convertview; } } Recyklace existujícího View getview() vrací jednu poloţku Adaptéru 15

9.3.2013 16 Výsledek vlastního ArrayAdapteru

9.3.2013 17 Výsledky optimalizačních technik Řádek ListView obsahuje pouze LinearLayout s TextView a ImageView Číselná hodnota na ose Y je v FPS Zdroj: Google I/O 2010

9.3.2013 18 Zobrazení různých vlastních layoutů poloţek @Override public View getview(int position, View convertview, ViewGroup parent) { ViewHolder holder; if (convertview == null) { if (getitemviewtype(position) == 0) { convertview = inflator.inflate(r.layout.row_even, null); } else { convertview = inflator.inflate(r.layout.row_odd, null); } ViewHolder viewholder = new ViewHolder(); viewholder.text =(TextView) convertview.findviewbyid(r.id.textview01); viewholder.image = (ImageView) convertview.findviewbyid(r.id.imageview01); convertview.settag(viewholder); } } else holder = (ViewHolder) convertview.gettag(); holder.text.settext(getitem(position)); return convertview; Pozor při pouţití vlastního pozadí prvků

9.3.2013 19 SimpleCursorAdapter Mapuje sloupce z Cursoru do jednotlivých View Příklad Získání Cursoru kontaktů: private Cursor getcontacts() { Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }; String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + ("1") + "'"; String[] selectionargs = null; String sortorder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; } return managedquery(uri, projection, selection, selectionargs, sortorder);

9.3.2013 20 Příklad SimpleCursorAdapteru - pokračování @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); Cursor mcursor = getcontacts(); startmanagingcursor(mcursor); ListAdapter adapter = new SimpleCursorAdapter(this, android.r.layout.two_line_list_item, mcursor, new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }, new int[] { android.r.id.text1, android.r.id.text2 }); } setlistadapter(adapter); Context Pole potřebných sloupců ID View odpovídajících daným sloupcům v layoutu poloţky

9.3.2013 21 Aktualizace poloţek v Adaptéru notifydatasetchanged() Notifikace observeru, ţe došlo ke změně dat a zobrazená View se mají aktualizovat Nastavený List<T> objects v konstruktoru Adaptéru nesmí být nahrazen jiným List<T> objects cursor.requery() Lze volat nad Cursorem vloţeným do CursorAdapteru

9.3.2013 22 ChoiceMode v ListView none singlechoice Pouze jedna poloţka stavu chosen state multiplechoice Více poloţek stavu chosen state Vypsání např. pomocí getcheckeditemposition() Vrací SparseBooleanArray(získání hodnoty pomocí valueat()) multiplechoicemodal Více poloţek stavu chosen state podle vlastního výběru Implementací AbsListView.MultiChoiceModeListener Za pouţití setmultichoicemodelistener(abslistview.multichoic emodelistener)

9.3.2013 23 Filtrace ListView Adaptéru je moţné doimplementovat Filterable V metodě getfilter() je poté nutné vrátit vlastní Filter Filter musí implementovat metody performfiltering() a publishresults() ArrayAdapter Má jiţ implementovaný vlastní ArrayFilter, který filtruje poloţky List<T> objects podle metody tostring() objektu T ArrayFilter je dobrou inspirací pro vlastní filtrování

9.3.2013 24 Expandable ListView Dvou úrovňový seznam Group Children K naplnění se pouţívá ExpandableListAdapter Zobrazuje stav u kaţdé skupiny expanded/collapsed Trochu obtíţnější naplnění daty

9.3.2013 25 Parametry displeje Velikost displeje (Screen size) Úhlopříčka displeje v palcích (inches např. 3.7 ) Hustota displeje (Screen density) Počet pixelů na danou plochu displeje (dpi - dots per inch) Orientace Na šířku (landscape) nebo na výšku (portrait) Ţádná orientace není defaultní

9.3.2013 26 Parametry displeje Rozlišení (Resolution) Počet fyzických pixelů na displeji (px - pixels) Nepouţívá se při návrhu pro podporu více různých displejů Density independent pixel Virtuální jednotka pouţívaná pro pozicování a rozměry prvků nezávislé na dpi (dip, dp nebo dps) sp, sip - obdoba dip pro velikost písma (lze změnit v systému)

9.3.2013 27 Hustota a velikost displejů Aktuální: http://developer.android.com/resources/dashboard/screens.html

9.3.2013 28 Podpora různých displejů Explicitně stanovit v manifestu, jaké displeje jsou podporovány Zacílení pouze na některá zařízení? Poskytnout různé layouty pro různé displeje Poskytnout různé (bitmap) drawables pro různé displeje Pouţívat Nine-patch bitmaps 7. přednáška

9.3.2013 29 Podpora různých displejů Pouţívat wrap_content a match_parent Pouţívat RelativeLayout Pouţívat tzv. configuration qualifiers ve sloţce res <resources_name>-<qualifier> Qualifiers hustota, orientace, rozměry displeje Více viz. 2. přednáška

9.3.2013 30 Podpora různých displejů Čtyři skupiny rozlišení jsou jiţ deprecated Od verze 3.2 se pouţívají parametry: Smallest width Available screen width Availabe screen height Potřeba zahrnout i starší zařízení Deprecated! Přepočet density independent pixel na pixely px = dp (dpi / 160) Např. na 240 dpi displeji, 1 dp odpovídá 1,5 fyzickému pixelu

9.3.2013 31 Přepočty Dva různě kvalitní displeje, kde však při pouţití density indepentend pixelů nedojde ke změně ve vzhledu layoutů apod. Parametry displeje Displej s nižším rozl. Displej s vyšším rozl. Úhlopříčka (palce) 1,5 1,5 Hustota (dpi) 160 240 Pixely (= úhl hust) 240 360 Hustota (faktor 160) 1.0 1.5 Density ind. pixels 240 240

9.3.2013 32 Tvorba grafiky Spousta faktorů ovlivňuje grafickou podobu aplikace např. Vlastnosti displeje (rozměry, rozlišení, technologie, orientace) Verze OS (velikost nativních prvků) Výbava zařízení (chybějící fotoaparát, GPS apod.) Postup (platí pro kreslení jednotlivých prvků) Určit si podporované displeje Grafiku tvořit pro nejvyšší podporované rozlišení a určit si rozměry prvku Převést (viz. obrázek) na menší rozměry Pohled ze strany grafika

9.3.2013 33 UI Guidelines Doporučené postupy ze stránek ADG http://developer.android.com/guide/practices/ui_guidelines /index.html UI Guidelines (zejména) pro Android 3.0+ http://developer.android.com/design/index.html Následuje výběr několika guidelines

9.3.2013 34 Velikost prvků Velikost Stisknutelných prvků - 48dp Mezery mezi částmi UI - 8dp Proč 48dp? Odpovídá cca 9mm doporučení pro dotykové displeje 7 10mm

9.3.2013 35 Styl psaní dialogů Uţivatel si spíše přečte krátkou hlášku neţ delší text Stručně nastavit si limit na cca 40 znaků včetně mezer Jednoduše pouţívat známé pojmy Přátelsky mluvit přímo k uţivateli To nejdůleţitější nejdříve první tři slova alespoň náznak toho podstatného Popsat pouze to podstatné Neopakovat se nepouţívat ten samý pojem několikrát

9.3.2013 36 Návrh ikon Pouţívat dostupné templaty Nespoléhat se, ţe budou obsaţeny v systému Pouţívat ikony v různých rozlišeních Vektorová grafika dostupná pouze pomocí uţivatelských knihoven Neměla by se pouţívat pro návrh ikon Pro zjednodušení si nechat vygenerovat ikony Např. Android Asset Studio http://android-ui-utils.googlecode.com/hg/assetstudio/dist/index.html

9.3.2013 37 Návrh UI - Skica Většinou ručně kreslená Výhoda Jednoduchost Nevýhoda Špatně se překresluje Moţnost vystřihnout jednotlivé komponenty a znovu pouţít Neodhadnutí velikosti prvků Pouţít čtverečkovaný papír Lze pouţít šablony rozměrů displeje

9.3.2013 38 Návrh UI - Wireframe Zaměřuje se na: Funkcionalitu Rozloţení prvků Wireframe je o funkci Interakci jednotlivých prvků Postrádá typografický styl, barvy nebo grafiku Např.: Řádek se stavem uţivatele bude nalevo pod jeho fotkou. Wireframe Sketcher http://wireframesketcher.com/

9.3.2013 39

9.3.2013 40 Návrh UI - Mockup Zaměřuje se na: Look and feel Mockup je o formě Staví na wireframe a přidává barvy a grafiku Můţe upravit rozloţení prvků, ale vychází především z wireframe Např.: Řádek se stavem uţivatele bude dvakrát menší neţ fotka a bude zabírat maximálně čtvrtinu řádky. Balsamiq Mockup http://www.balsamiq.com/products/mockups

9.3.2013 41 Návrh UI - Prototyp Ukazuje finální design a jeho funkcionalitu Přichází po ujasnění poţadavků a omezení z předchozích fází Můţe obsahovat různě velkou míru implementace Stále se však jedná o artefakt Stále se nemusí jednat o finální podobu designu

9.3.2013 42 Další zdroje http://android-developers.blogspot.com/2009/01/why-ismy-list-black-android.html http://androidniceties.tumblr.com/ http://developer.android.com/guide/practices/design/acces sibility.html http://code.google.com/p/android-ui-utils http://pencil.evolus.vn