Proiectarea interfeței utilizator Android Tablouri

Tabelele de planuri pot fi utilizate pentru afișarea datelor tabulare sau alinierea cu ușurință a conținutului ecranului într-un mod similar unui tabel HTML de pe o pagină Web. Aflați cum să le creați cu fișiere XML de aspect și prin cod.

Înțelegerea aspectului este importantă pentru un design bun al aplicațiilor Android. În acest tutorial, învățați totul despre layout-urile de tabelă, care organizează comenzile interfeței utilizator sau widget-urile, pe ecran în rânduri și coloane bine definite. Atunci când este utilizat corect, layout-urile tabelului pot fi paradigma de aspect puternic pe care aplicațiile Android pot proiecta ecrane sau pot afișa date tabulare.

Ce este un tabel??

O structură de tabelă este exact ceea ce vă așteptați: o grilă formată din rânduri și coloane, unde o celulă poate afișa un control al vizualizării. Din perspectiva designului interfeței utilizator, un TableLayout este alcătuit din comenzile TableRow - câte unul pentru fiecare rând din tabel. Conținutul unui TableRow sunt pur și simplu controalele de vizualizare care vor merge în fiecare celulă? din grila de masă.

Apariția unui TableLayout este reglementată de mai multe reguli suplimentare. În primul rând, numărul de coloane din întregul tabel corespunde numărului de coloane din rândul cu cele mai multe coloane. În al doilea rând, lățimea fiecărei coloane este definită ca lățimea celui mai larg conținut din coloană. Rândurile Child Rays și celulele layout_width sunt întotdeauna MATCH_PARENT - deși pot fi puse într-un fișier XML, valoarea reală nu poate fi înlocuită. Schema Layout_height a unei celule poate fi definită, dar un atribut TableRow pentru layout_height este întotdeauna WRAP_CONTENT. Celulele pot include coloane, dar nu și rânduri. Acest lucru se face prin atributul layout_span al vizualizării copilului unui TableRow. O celulă este o vizualizare unică în cadrul unui TableRow. Dacă doriți o celulă mai complexă cu mai multe vizualizări, utilizați o vizualizare de aspect pentru a încapsula celelalte vizualizări.

Acestea fiind spuse, unele reguli pot fi modificate. Coloanele pot fi marcate ca stretchable, ceea ce înseamnă că lățimea se poate extinde la dimensiunea recipientului părinte. Coloanele pot fi de asemenea marcate ca fiind contractibile, ceea ce înseamnă că ele pot fi reduse în lățime, astfel încât întregul rând se va potrivi în spațiul furnizat de containerul părinte. De asemenea, puteți restrânge o întreagă coloană.

Pentru documentația completă pentru machete de tabelă, consultați documentația Android SDK pentru clasa TableLayout. Atribuiile XML asociate pentru utilizarea în resursele XML sunt, de asemenea, definite în documentație.

Proiectarea unui layout simplu de tabel

Amenajările sunt cel mai bine explicate prin exemplu, iar planurile tabelului nu diferă. Să presupunem că vrem să proiectăm un ecran care să prezinte prognoza meteo extinsă. O structură tabelă ar putea fi o alegere bună pentru organizarea acestor informații:

  • În primul TableRow, putem afișa un titlu pentru ecran.
  • În cel de-al doilea TableRow, putem afișa datele într-un format familiar asemănător calendarului.
  • În al treilea tabel, putem afișa o informație zilnică de temperatură ridicată.
  • În al patrulea tabel, putem afișa o informație zilnică de temperatură scăzută.
  • În cel de-al cincilea TableRow, putem afișa grafică pentru a identifica condițiile meteorologice, cum ar fi ploaia, zăpada, soarele, sau noros, cu o șansă de chifteluțe.

Această primă figură arată o privire timpurie la masa din interiorul editorului de layout:

Definirea unei resurse XML Layout cu un tabel

Modul cel mai convenabil și mai ușor de întreținut pentru a proiecta interfețele utilizatorilor de aplicații este crearea de resurse XML de aspect. Această metodă simplifică foarte mult procesul de proiectare UI, deplasând o mare parte din crearea și structura statică a controalelor interfeței utilizator și definirea atributelor de control, în XML, în loc de a aluneca codul.

Resursele de aspect XML trebuie să fie stocate în ierarhia directorului / res / layout project. Să aruncăm o privire la aspectul tabelului introdus în secțiunea anterioară. Acest fișier de resurse de dispunere, desemnat corespunzător /res/layout/table.xml, este definit în XML după cum urmează:

                                      

Amintiți-vă că, din cadrul activității, este necesară numai o singură linie de cod în cadrul metodei onCreate () pentru a încărca și a afișa o resursă de aspect pe ecran. Dacă resursa de dispunere a fost stocată în fișierul /res/layout/table.xml, acel rând de cod ar fi:

 setContentView (R.layout.table); 

Acest aspect al tabelului are toate coloanele setate atât pentru a se micșora, cât și pentru a se întinde utilizând un "*" în valoare. Dacă doar anumite coloane ar trebui să se micșoreze sau să se întindă, valorile ar fi o listă separată prin virgulă (folosind indici bazați pe 0 pentru coloane).

Acum, tabelul arată ca și cum ar fi capturile de ecran în modul portret și peisaj.

Definirea programată a tabelului

De asemenea, puteți să creați și să configurați programabil tabelele în Java. Acest lucru se face folosind clasele TableLayout și TableRow (android.widget.TableLayout și android.widget.TableRow). Veți găsi parametrii unici de afișare pentru fiecare comandă din clasele TableLayout.LayoutParams și TableRow.LayoutParams. De asemenea, parametrii tipici de aspect (android.view.ViewGroup.LayoutParams), cum ar fi layout_height și layout_width, precum și parametrii de margine (ViewGroup.MarginLayoutParams), se aplică în continuare obiectelor TableLayout și TableRow, dar nu neapărat celule de tabelă. Pentru celulele de masă (orice Vizualizare în cadrul TableRow), lățimea este întotdeauna MATCH_PARENT. Înălțimea poate fi definită, dar implicită este WRAP_CONTENT și nu trebuie specificată.
În loc să încărcați o resursă de structură direct utilizând metoda setContentView () așa cum este arătat mai devreme, dacă creați un aspect programat, trebuie să construiți conținutul ecranului în Java și apoi să furnizați un obiect de aspect parental care conține toate conținutul de control pentru a fi afișat vizualizarea copilului la metoda setContentView (). În acest caz, aspectul părinte utilizat ar fi aspectul tabelă creat.

De exemplu, următorul cod ilustrează modul în care trebuie să creați în mod programatic o activitate de instanțiere a parametrilor Layout Layout și să reproduceți exemplul arătat mai devreme în XML:

 @Override publice void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); TableLayout table = tabelul nou (acest lucru); table.setStretchAllColumns (true); table.setShrinkAllColumns (true); TableRow rowTitle = noul TableRow (acest); rowTitle.setGravity (Gravity.CENTER_HORIZONTAL); TableRow rowDayLabels = new TableRow (acest lucru); Rândul TabelRândVeșează = Tabelul noi (acest lucru); TableRow rowSet = new TableRow (acest lucru); TableRow rowConditions = new TableRow (aceasta); rowConditions.setGravity (Gravity.CENTER); TextView gol = nou TextView (acest); // coloana / rândul titlului TextView title = new TextView (this); title.setText ("Tabelul pentru Vremea Java"); titlu.setTextSize (TypedValue.COMPLEX_UNIT_DIP, 18); title.setGravity (Gravity.CENTER); titlu.setTypeface (Typeface.SERIF, Typeface.BOLD); TableRow.LayoutParams Params = noul TableRow.LayoutParams (); params.span = 6; rowTitle.addView (titlu, paramuri); // coloana etichete TextView highsLabel = textView (aceasta); highsLabel.setText ("Day High"); highsLabel.setTypeface (Typeface.DEFAULT_BOLD); TextView lowsLabel = TextView nou (aceasta); lowsLabel.setText ("Day Low"); lowsLabel.setTypeface (Typeface.DEFAULT_BOLD); Condițiile textViewLabel = TextView nou (acesta); conditionsLabel.setText ( "condiții"); conditionsLabel.setTypeface (Typeface.DEFAULT_BOLD); rowDayLabels.addView (gol); rowHighs.addView (highsLabel); rowLows.addView (lowsLabel); rowConditions.addView (conditionsLabel); // ziua 1 coloană TextView day1Label = textul Text nou (acest lucru); day1Label.setText ("Feb 7"); day1Label.setTypeface (Typeface.SERIF, Typeface.BOLD); TextView day1High = TextView nou (acest lucru); day1High.setText ( "28шF"); day1High.setGravity (Gravity.CENTER_HORIZONTAL); TextView day1Low = TextView nou (acest lucru); day1Low.setText ( "15шF"); day1Low.setGravity (Gravity.CENTER_HORIZONTAL); ImageView day1Conditions = nou ImageView (aceasta); day1Conditions.setImageResource (R.drawable.hot); rowDayLabels.addView (day1Label); rowHighs.addView (day1High); rowLows.addView (day1Low); rowConditions.addView (day1Conditions); // coloana day2 TextView day2Label = TextView nou (aceasta); day2Label.setText ("Feb 8"); day2Label.setTypeface (Typeface.SERIF, Typeface.BOLD); TextView day2High = TextView nou (acest lucru); day2High.setText ( "26шF"); day2High.setGravity (Gravity.CENTER_HORIZONTAL); TextView day2Low = TextView nou (acesta); day2Low.setText ( "14шF"); day2Low.setGravity (Gravity.CENTER_HORIZONTAL); ImageView day2Conditions = new ImageView (acest lucru); day2Conditions.setImageResource (R.drawable.pt_cloud); rowDayLabels.addView (day2Label); rowHighs.addView (day2High); rowLows.addView (day2Low); rowConditions.addView (day2Conditions); // coloana day3 TextView day3Label = TextView nou (aceasta); day3Label.setText ("Feb 9"); day3Label.setTypeface (Typeface.SERIF, Typeface.BOLD); TextView day3High = TextView nou (acest lucru); day3High.setText ( "23шF"); day3High.setGravity (Gravity.CENTER_HORIZONTAL); TextView day3Low = TextView nou (acesta); day3Low.setText ( "3шF"); day3Low.setGravity (Gravity.CENTER_HORIZONTAL); ImageView day3Conditions = nou ImageView (acest); day3Conditions.setImageResource (R.drawable.snow); rowDayLabels.addView (day3Label); rowHighs.addView (day3High); rowLows.addView (day3Low); rowConditions.addView (day3Conditions); // coloana day4 TextView day4Label = TextView nou (aceasta); day4Label.setText ("Feb 10"); day4Label.setTypeface (Typeface.SERIF, Typeface.BOLD); TextView day4High = TextView nou (acest lucru); day4High.setText ( "17шF"); day4High.setGravity (Gravity.CENTER_HORIZONTAL); TextView day4Low = TextView nou (acest lucru); day4Low.setText ( "5шF"); day4Low.setGravity (Gravity.CENTER_HORIZONTAL); ImageView day4Conditions = new ImageView (acest lucru); day4Conditions.setImageResource (R.drawable.lt_snow); rowDayLabels.addView (day4Label); rowHighs.addView (day4High); rowLows.addView (day4Low); rowConditions.addView (day4Conditions); // coloana day5 TextView day5Label = TextView nou (acest lucru); day5Label.setText ("11 februarie"); day5Label.setTypeface (Typeface.SERIF, Typeface.BOLD); TextView day5High = TextView nou (acest lucru); day5High.setText ( "19шF"); day5High.setGravity (Gravity.CENTER_HORIZONTAL); TextView day5Low = TextView nou (acest lucru); day5Low.setText ( "6шF"); day5Low.setGravity (Gravity.CENTER_HORIZONTAL); ImageView day5Conditions = new ImageView (aceasta); day5Conditions.setImageResource (R.drawable.pt_sun); rowDayLabels.addView (day5Label); rowHighs.addView (day5High); rowLows.addView (day5Low); rowConditions.addView (day5Conditions); table.addView (rowTitle); table.addView (rowDayLabels); table.addView (rowHighs); table.addView (rowLows); table.addView (rowConditions); setContentView (tabel);  

Să aruncăm o privire mai atentă la lista de cod Java de mai sus. Mai intai creem controlul TableLayout si setam atributele contractibile si stretchable la true pentru toate coloanele folosind metodele setStretchAllColumns () si setShrinkAllColumns (). Apoi, vom crea sistematic cinci TableRow. Fiecare TableRow va conține controale de vizualizare (controale TextView pentru titlu, date, înalte și date scăzute, precum și controale ImageView pentru grafica condițiilor meteo). Veți vedea modul în care este gestionată intervalul de coloană cu primul TableRow. Coloanele de vizualizări specifice sunt create, șablonate și adăugate, în ordine, la metoda TableRow corespunzătoare utilizând metoda addView (). Fiecare TableRow este adăugat la controlul TableLayout, în ordine, utilizând metoda addView () din TableLayout. În cele din urmă, încărcăm TableLayout și îl afișăm pe ecran folosind metoda setContentView ().

După cum puteți vedea, codul poate crește rapid în mărime deoarece se adaugă mai multe controale pe ecran. Pentru organizare și mentenabilitate, definirea și folosirea planurilor este cel mai bine lăsată pentru caz ciudat decât pentru normă. În plus, într-un astfel de caz, datele ar proveni, de obicei, dintr-o altă sursă decât șirurile pe care le introducem, astfel încât o buclă poate fi mai potrivită pentru multe aplicații.

Rezultatele sunt prezentate în figura următoare. După cum puteți vedea, acestea sunt aceleași cu rezultatele anterioare - cum era de așteptat.

Preocupări pentru tabel

Deși layout-urile tabelelor pot fi folosite pentru a proiecta interfețe întregi ale utilizatorilor, acestea nu sunt de obicei cel mai bun instrument pentru a face acest lucru, deoarece sunt derivate din LinearLayout și nu cele mai eficiente controale de aspect. Dacă vă gândiți la asta, un TableLayout este puțin mai mult decât un set organizat de LinearLayouts imbricate, iar aspectul cuibăririi prea adânc este, în general, descurajat de preocupările legate de performanță. Cu toate acestea, pentru datele care există deja într-un format adecvat pentru o tabelă, cum ar fi datele de calcul tabelar, aspectul tabelului poate fi o alegere rezonabilă.

De asemenea, datele privind aspectul tabelului pot varia în funcție de dimensiunile și rezoluțiile ecranului. În general, este o practică bună de proiectare pentru a vă asigura că permiteți derularea când afișați cantități mari de date. De exemplu, dacă exemplul de vreme folosit mai devreme a inclus și o "write-up"? a condițiilor, acest text ar putea fi o propoziție sau douăzeci de propoziții, permițând astfel derularea verticală și / sau orizontală să fie prudentă.

Concluzie

Interfețele pentru utilizatorii de aplicații Android sunt definite folosind layout-uri, iar layout-urile de tabele sunt incredibil de utile pentru afișarea datelor de vizualizare sau a comenzilor în rânduri și coloane. Folosind layout-uri de tabel în cazul în care acestea sunt adecvate poate face mai multe modele de ecran simplu și mai rapid. Cu toate acestea, rețineți că TableLayout este derivat din LinearLayout și are multe dintre aceleași limite de performanță.

despre autori

Dezvoltatorii mobili Lauren Darcey și Shane Conder au coautorizat mai multe cărți despre dezvoltarea Android: o carte de programare în profunzime intitulată Dezvoltarea aplicațiilor fără fir Android și Sams TeachYourself Dezvoltarea de aplicații Android în 24 de ore. Când nu scriu, își petrec timpul dezvoltând software-ul mobil la compania lor și oferind servicii de consultanță. Acestea pot fi obținute prin e-mail la androidwirelessdev@[email protected], prin intermediul blogului lor la androidbook.blogspot.com, și pe Twitter @ androidwireless.

Aveți nevoie de mai mult ajutor pentru scrierea aplicațiilor Android? Consultați cele mai recente cărți și resurse!

я я

Cod