Pana acum am folosit in exemplele din aceasta serie – care e la inceput – numai o singura fereastra sau 2 ferestre distincte, care nu prea comunica intre ele. E cam inutil sa ai o aplicatie a caror ferestre nu comunica.
In acest episod, care e format din 6 filmulete, intinse, insumat, pe o perioada de cam o ora si jumatate, vom construi o prima aplicatie functionala, care face ceva. In acest episod voi arata cum se construiesc 2 frestre (Activity), cum se navigheaza intre ele, cum se transfera un obiect intre ele si cum se creaza dinamic controale (views). Urmeaza ca in episodul urmator sa completez aplicatia si sa salvez/incarc datele introduse.
Aplicatia pe care o voi crea se numeste “Friends Book”, un fel de agenda telefonica. Nu m-am gandit cat de mult voi dezvolta aceasta aplicatie fara importanta practica, insa o voi folosi cateva episoade – e mai usor de invatat pe o aplicatie concreta (chiar daca inutila) decat din exemple distincte, fara legautra intre ele, si fara un scop precizat.
Asa cum spuneam, aplicatia are 2 ferestre:
1. Fereastra principala (MAIN), in care putem vedea lista prietenilor introdusi, si in care putem sa facem managementul acestora si
2. Fereastra unde vom adauga sau edita un prieten din lista noastra.
Vom defini o clasa CustomContact, care este de fapt un mod de a stoca impreuna date despre o persoana, date care includ nume, email, telefon si, pentru management, un id, unic. Instante ale acestei clase vor fi transferate intre ferestrele aplicatiei.
Insa pana ajungem la comunicarea intre ferestre sa construim ferestrele (video):
Pana aici avem doua ferestre intre care pot naviga. Fereastra principala contine si un container pe care il voi folosi pentru a afisa lista de prieteni pe care ii voi introduce cu ajutorul ferestrei secundare.
In a doua parte vom incepe sa comunicam intre ferestre, cu ajutorul Intent. Un intent poate primi un obiect Bundle cu ajutorul caruia se poate transmite informatie intre ferestre. Cand afisam o noua fereastra nu folosim metoda startActivity, ca in episoadele trecute, ci startActivityForResult. Aceasta modalitate de a deschide o fereastra permite interceptarea unui raspuns de la fereastra deschisa. Pentru asta va trebui sa suprascriem metoda onActivityResult a clasei activity.
In aceasta parte vom introduce obiectul CustomContact care va contine tot ce avem nevoie despre o persoana, iar intre ferestrele aplicatiei vom transmite obiecte de acest tip. Pentru a putea fi transmis folosind un Intent clasa din care construim obiectul trebuie sa implementeze interfata Serializable, care, din puctul nostru de vedere presupune numai definirea unei constante suplimentare. Pentru a atasa Intent-ului acest obiect vom folosi metoda putSerializable a clasei Bundle, asa cum se vede din film. Pentru a extrage obiectul transmis se foloseste metoda getSerializable(). Procesul de destul de simplu, asa ca nu voi discuta prea mult despre asta.
Ce este important de subliniat este modul cum adaug controale (views) dinamic, in timpul executiei. Controalele visuale sunt derivate din clasa View, si sunt de 2 tipuri – controale container si controale copil (care nu pot contine alte controale). LinearLayout este un control de tip container in care vom adauga controale la runtime, in acest episod vom adauga o lista de TextViews.
Pentru a instantia un obiect pentru o clasa derivata din View voi folosi urmatorul constructor:
AAAAA view = new AAAAA(context);
unde AAAAA poate fi (cred) orice contrul standard Android. In film voi instantia TextView asa:
TextView view = new TextView(this);
unde parametrul this da contextul necesar. Odata construit un astfel de obiect, el poate fi adaugat unui container, in cazul nostru LinearLayout folosind metoda addView(view) a containerului.
La finalul acestui episod avem o lista pe care o putem creste prin adaugarea de noi contacte. In partea a 4-a voi adauga functiile edit si delete. In acest punct avem nevoie de un obiect care sa pastreze referinte spre contactele adaugate, si in acest scop vom crea un obiect de tip List
Ce este important este sa organizez putin codul, sa construiesc metode specializate, care sa ma ajute sa execut diverse taskuri repetitive, astfel incat, de exemplu, cand am nevoie de crearea unui obiect de tip TextView, sa pot folosi o metoda care sa primeasca un test si care sa imi returneze obiectul dorit.
La fel de important este ca in fereastra add/edit contact sa facem diferenta intre add si edit, respectiv vom folosi obiectul transmis (CustomContact) care, daca e null putem spune ca avem de creat un nou contact, iar in caz diferit vom edita obiectul primit.
A venit si momentul sa facem lista de prieteni putin mai complicata, prin transformarea fiecarei inregistrari intr-un control compus, control alcatuit dintr-un TextView si doua butoane (Edit si Delete), la a caror apasare sa pot efectua operatii edit/delete.
Pentru asta vom defini un nou layout in xml, asa cum se vede in film, si pe care il vom folosi prin intermediul LayoutInflater.
Si ultima parte, scurta:
In acest moment avem o aplicatie functionala, care permite crearea unei liste de persoane. Nu putem salva acum decat numele persoanelor, insa in timp vom completa functionalitatea aplicatiei. In episodul urmator vom include lista din acest episod intr-un container care sa ne permita sa derulam lista, deoarece am observat ca dupa ce adaugam un numar de contacte, ele nu mai apar vizibile. Deasemeni vom introduce si un meniu (butonul Add nu arata prea frumos acolo unde este), iar in final ne vom ocupa de salvarea datelor pentru utilizare ulterioara!
Va multumesc pentru vizionare si va astept comentarii. Aplicatia pe care o dezvolt in acest episod este tot ce mi-am putut imagina ca aplicatie de exercitiu. Daca e cineva care are alte sugestii, sunt deschis sa le primesc.
Ce am invatat in acest episod: comunicare intre ferestre (Activities), construirea de controale in mod dinamic, in timpul executiei, folosirea layout-urilor in cadrul aplicatiei pentru a defini parti ale ferestrei, lucrul cu liste (List<>), tehnici de acces la obiectele definite in XML.
Deoarece codul este destul de lung, nu mai este practica postarea lui integrala ca parte a articolului, asa ca el este atasat ca fisier zip.
Codul complet al acestui tutorial poate fi downloadat aici.
Ion says:
Continuarea nu o vei face???
STEFAN says:
Felicitari ! Asteptam cu interes ccontinuarea.
MULT RESPECT !