====== Laborator 03. Proiectarea Interfețelor Grafice ====== ===== Clase Android utilizate pentru definirea unei interfețe grafice ===== În cadrul unei aplicații Android, o interfață grafică conține elemente care au capabilitatea de a afișa informații către utilizator, în diferite formate, respectiv de a interacționa cu acesta, preluând datele necesare realizării diverselor fluxuri operaționale din cadrul aplicației. Există și o categorie specială de controale grafice, responsabile numai cu gestiunea mecanismului de dispunere a celorlalte componente, determinând modul în care vor fi plasate în cadrul ferestrei precum și coordonatele la care vor fi poziționate. Structura unei interfețe grafice este arborescentă. Întotdeauna, elementul rădăcină va fi un control care gestionează modul în care sunt dispuse componentele sale, în timp ce elementele frunză sunt controale grafice propriu-zise, vizibile pe ecran, cu o funcționalitate bine delimitată. Pe toate celelalte niveluri (intermediare) din această ierarhie se pot regăsi elemente de ambele tipuri (atât elemente grafice cât și mecanisme de dispunere a conținutului - care controlează în acest fel o secțiune din cadrul interfeței cu utilizatorul). Clasa ''android.view.View'' reprezintă baza pentru construirea oricărei interfețe grafice dintr-o aplicație Android. Ea definește o zonă rectangulară a dispozitivului de afișare (ecran), majoritatea controalelor grafice și a mecanismelor de dispunere a conținutului fiind derivate din aceasta. {{ :laboratoare:laborator03:tipuri_de_controale_grafice.png?nolink&500 }} **1.** Cele mai multe **elemente grafice** sunt definite în pachetul ''android.widget'', fiind implementate controale care implementează cele mai multe dintre funcționalitățile uzuale (etichete, câmpuri text, controale pentru redarea de conținut multimediat - imagini, filme -, butoane, elemente pentru gestiunea datei calendaristice și a timpului). Trebuie să se facă distincția între control, afișat în interfața grafică a unei activități, definit în pachetul ''android.widget'' și extensiile aplicațiilor, afișate în ecranul principal al dispozitivului mobil, cunoscute sub denumirea de widget-uri, dar care fac parte din clasa ''android.appwidget.AppWidget''. **2.** Controalele pentru gestiunea **mecanismului de dispunere a conținutului** au rolul de a determina modul în care sunt afișate elementele conținute. Acestea sunt derivate din clasa ''android.view.ViewGroup'', definind mai multe reguli prin care se determină poziția la care vor fi plasate componentele pe care le includ. ===== Mecanisme pentru construirea unei interfețe grafice ===== O interfață grafică poate fi construită în două moduri: - prin definirea elementelor componente și a modului lor de dispunere în cadrul unui fișier .xml, asociat fiecarei activități (sau fragment) în parte, situație adecvată cazurilor în care interfața grafică este statică; - programatic, prin instanțierea unor obiecte de tipul elementelor componente direct în codul sursă (cu stabilirea proprietăților respective) al activității (sau fragmentului), abordare potrivită pentru situațiile în care interfața grafică are o structură dinamică (este actualizată în funcție de unele condiții specifice identificate în momentul execuției). De regulă, se preferă ca interfața grafică să fie definită în cadrul unui fișier ''.xml'' pentru fiecare fereastră din cadrul aplicației Android, întrucât acesta este mult mai ușor de întreținut, separând sarcinile ce țin de proiectare propriu-zisă de cele care țin de programare (putând fi realizate astfel de persoane diferite). Totuși, pentru situațiile în care interfața grafică nu este cunoscută la momentul compilării sau pentru cazul în care interfața grafică trebuie modificată în funcție de anumite condiții identificate în momentul compilării, pot fi utilizate metode programatice spre a obține o astfel de funcționalitate. ==== Construirea unei interfețe grafice în XML ==== Pentru fiecare activitate se va construi un fișier .xml în directorul ''res/layout'' care va descrie conținutul interfeței grafice precum și modul de dispunere al controalelor componente. În cazul în care se dorește să se definească o altă intefață grafică, adaptată la schimbarea orientării ecranului, se va folosi directorul ''res/layout-land'' în care conținutul fișierului .xml (având aceeași denumire) va fi modificat corespunzător. Selecția interfeței grafice în funcție de dimensiunile suprafeței de afișare este realizată în mod automat de sistemul de operare Android. Pentru fiecare resursă de acest tip, se va genera o referință în clasa ''layout'' din fișierul generat ''R.java'', care va putea fi utilizată pentru încărcarea interfeței grafice în cadrul metodei ''onCreate(Bundle savedInstanceState)''. setContentView(R.layout.activity_layout_sample_1); După încărcarea propriu-zisă a elementelor din cadrul interfeței grafice vor putea fi obținute referințe către ele prin intermediul metodei ''findViewById()'', care: * primește ca parametru un identificator (întreg) definit (automat) în clasa ''id'' din fișierul generat ''R.java'' pentru toate componentele din cadrul interfeței grafice care au definit atributul ''android:id'' (pe baza căruia pot fi referite); * returnează un obiect de tip ''android.view.View'', fiind necesar să se realizeze conversia explicită către tipul de control grafic dorit. TextView greetingTextView = (TextView)findViewById(R.id.greeting_text_view); Atât mediul integrat de dezvoltare Android Studio cât și mediul integrat de dezvoltare Eclipse pun la dispoziția programatorilor atât un utilitar conținând biblioteci de controale, în care interfața grafică poate fi definită prin operații de tip drag-and-drop, cât și un editor text în care proprietățile acestor elemente pot fi specificate manual. Schimbările realizate într-una dintre aceste ferestre sunt transpuse automat și în cealaltă, astfel încât modificările din mediul vizual generează etichetele XML corespunzătoare, în timp ce efectul unor proprietăți stabilite în fișierul XML poate fi vizualizat imediat în editorul grafic. {{ :laboratoare:laborator03:androidstudio_graphical_layout.png?nolink&650 }} În **Android Studio**, utilitarul vizual poate fi accesat din panoul //Design//, putând fi specificate (prin selecția dintr-o listă) dispozitivul mobil pentru care se proiectează interfața grafică, orientarea ecranului (precum și alte moduri în care se poate găsi acesta), tema aplicației (stilul folosit), activitatea căreia îi este asociat, localizarea precum și nivelul de API. În cadrul bibliotecii de controale, organizarea elementelor grafice se face prin împărțirea lor în mai multe categorii: * mecanisme de dispunere a conținutului (//Layouts//); * forme de bază (//Widgets//); * câmpuri text (//Text Fields//); * controale grafice ce pot conține alte componente(//Containers//); * elemente pentru gestiunea datei calendaristice și a timpului (//Date & Time//); * componente complexe de interacțiune cu utilizatorul (//Expert//); * obiecte definite de utilizator (//Custom//); Structura interfeței grafice (ierarhia de controale grafice) poate fi (pre)vizualizată, pentru fiecare obiect în parte indicându-se identificatorul său (dacă este definit) și tipul (între paranteze rotunde), în secțiunea //Component Tree//. Pentru fiecare control grafic, atributele sale pot fi gestionate în secțiunea //Properties//, fiind afișate toate proprietățile pe care le poate avea (proprii sau moștenite de la părinte), împreună cu valorile pe care le poate lua, utilizatorul putând alege dintre acestea. {{ :laboratoare:laborator03:eclipse_graphical_layout.png?nolink&650 }} În **Eclipse**, utilitarul vizual poate fi accesat din panoul //Graphical Layout//, putând fi specificate (prin selecția dintr-o listă) dispozitivul mobil pentru care se proiectează interfața grafică, orientarea ecranului (precum și alte moduri în care se poate găsi acesta), tema aplicației (stilul folosit), activitatea căreia îî este asociat, localizarea precum și nivelul de API. În cadrul bibliotecii de controale, organizarea elementelor grafice se face prin împărțirea lor în mai multe categorii: * forme de bază (//Form Widgets//); * câmpuri text (//Text Fields//); * mecanisme de dispunere a conținutului (//Layouts//); * controale compuse (//Composite//); * componentele multimedia (//Images & Media//); * elemente pentru gestiunea datei calendaristice și a timpului (//Time & Date//); * tranziții (//Transitions//); * componente complexe de interacțiune cu utilizatorul (//Advanced//); * obiecte definite de utilizator (//Custom & Library Views//); Structura interfeței grafice (ierarhia de controale grafice) poate fi (pre)vizualizată în fereastra //Outline//, pentru fiecare obiect în parte indicându-se identificatorul său (dacă este definit) și tipul (între paranteze rotunde). Pentru fiecare control grafic, atributele sale pot fi gestionate în secțiunea //Properties//, fiind afișate toate proprietățile pe care le poate avea (proprii sau moștenite de la părinte), împreună cu valorile pe care le poate lua, utilizatorul putând alege dintre acestea.