Manager Activitati

Cuprins

Introducere

Capitolul I: Aspecte teoretice

1. Alegerea programului și instalarea acestuia

2. Adăugarea de pluginuri

3. Crearea proiectului

4. Informații despre foldere din res

Capitolul II:

Proiectarea aplicației

1. UML

2. Clasificarea diagramelor UML

2.1. Diagrame de comportament

2.1.1. Diagrama Cazurilor de Utilizare

2.1.2. Diagrama de activități

2.2. Diagrame de Structură

2.2.1. Diagrama de clase

2.2.2. Diagrama de obiecte

Capitolul III:

Crearea și explicarea aplicației

1. Adăugarea obiectelor pe interfața aplicației

1.1. Prima pagină a aplicației (activity_main.xml)

1.1.1. Proprietățile obiectelor

1.2. A doua pagină (listview_item.xml)

1.2.1. Proprietățile obiectelor

1.3. Pagina Îndrumător

1.3.1. Proprietățile obiectelor din pagina Îndrumător

1.4. Bara de Activități

2. Explicarea aplicației

2.1. Declararea variabilelor

2.2. Atribuirea variabilelor

2.3. Dezactivarea butonului „Adaugă”

2.4. Utilizarea TabHostului

2.5. Toast

2.6. Clase

2.7. List

2.8. Baza de date

2.8.1. Ce conține clasa DatabaseHandler.java

2.8.3. Funcția de modificare a Tabelului

2.8.4. Funcția de creare a Contactului

2.8.5. Funcția de citire a Contactului

2.8.6. Funcția de ștergere a Contactului

2.8.7. Funcția de preluare date

2.9. Butonul „Adaugă”

2.10. Ștergerea Contactului

2.11. Date Picker

3. Baza de date Online

3.1. Crearea bazei de date online

3.2. PHP

3.3. Realizarea conexiunii în MainActivity

4. Stilizarea Activity Bar

Concluzii și propuneri

Bibliografie

Introducere

Aplicația mea se numește „Manager Activități”. Această aplicație este o Agendă (Schedule), în care se introduc date despre activitățile pe care le va realiza utilizatorul.

Din punctul meu de vedere, am realizat această aplicație deoarece aveam nevoie de un planificator în care să introduc informații despre ce vreau să fac într-o anumită zi, pentru că în zilele de astăzi suntem foarte presați de timp. Deoarece trăiesc în era tehnologică și a stresului, am momente în care uit anumite aspecte, de aceea acele informații prefer să să le introduc într-o aplicație care îmi ușurează foarte mult munca.

Aplicația mea poate păstra date atât în memoria telefonului cât și într-o Bază de Date online.

Baza de date este formată dintr-un tabel, la fel și baza de date din telefon.

Lucrarea de față cuprinde trei capitole în care am descris am realizat și cum funcționează aplicația.

În primul capitol aspecte teoretice despre programul „Android Studio”, și anume: cum se instalează programul, ce plugin-uri trebuie să instalez, cum creez un proiect, informații despre cum sunt așezate folderele în program etc.

În al doilea capitol am realizat proiectarea aplicației cu ajutorul limajului UML. Acest limbaj mi-a permis să descriu aplicația prin intermediul diagramelor: Use Case, Activități, Clase și Obiecte.

În ultimul capitol am descris modul în care funcționează aplicația.

Acestă aplicație este destinată tuturor oamenilor care au nevoie de o Agendă în propriul telefon.

Capitolul I: Aspecte teoretice

Alegerea programului și instalarea acestuia

Această aplicație a fost realizată în programul Android Studio 1.0.1 . Am folosit acest program deoarece a fost foarte bine gandit si a eliminat foarte multe probleme pe care Eclipse mi le făcea.

În primul rând am downloadat programul de pe site-ul Android Developers https://developer.android.com/sdk/index.html

Fig 1

Această figură arată locul de unde am instalat programul, ce conține acesta și alte informații utile .

Apoi, am instalat programul cu foarte mare grijă în sensul că trebuie sa fi foarte atent unde se salvează sdk-ul si programul propriu-zis ( de ex: nu se știe cand ai nevoie să cauți niște resurse drawable pentru aplicația ta) .

După ce se instalează programul a trebuit neapărat să intru la SDK Manager unde am dat să-mi intaleze urmatoarele:

Tot ce se află in folderul Tools;

Ultima versiune de Android 5.1.1;

Versiunea mea pe care am vrut să lucrez de la bun început și anume Android 4.1.2, deoarece este versiunea de android pe care o am pe telefonul meu;

Tot ce se află în folderul Extras.

Adăugarea de pluginuri

Un alt pas foarte important a fost să integrez o noua mașina virtuală în Android Studio

pentru că Mașina Virtuală a programului (AVD Manager) era foarte lentă pe leptopul meu . Din această cauză am instalat Genymotion, care este un emulator foarte bun și foarte rapid.

L-am downloadat de pe site-ul https://www.genymotion.com/#!/ , am instalat aplicația, iar apoi am intrat în Setările aplicației, la Plugins unde am adăugat pluginul Genymotion .

În acest moment programul meu este configurat în așa fel încât pot să mă apuc de aplicația mea.

Crearea proiectului

Am deschis programul și am apăsat pe un nou proiect.

Fig 2

În Figura 2 sunt prezentate următoarele:

Numele pe care trebuie sa îl dau aplicației: Manager Activități;

Domeniul companiei: com.cata.andreeacatalin.contactmanager;

Locația proiectului: D:\PROIECTE-ANDROID\1.1.1\ContactManager.

Fig 3

Apoi am ales conform Figurii 3 o versiune de android pe care va rula aplicația, în cazul meu este Android 4.1.2 (Jelly Bean). Aceasta este versiounea de android pe care o am pe telefon .

Fig 4

Am ales activitatea pentru aplicația mea : Blank Activity

Fig 5

Nu în ultimul rând trebuie dată :

o denumire pentru activitate: MainActivity;

o denumire pentru Layout: activity_main;

o denumire pentru titlu: MainActivity;

o denumire pentru meniul de resurse: menu_main.

În acest moment proiectul meu este creat și pregatit să lurez în el .

Informații despre foldere din res

Res este folderul care conține resursele aplicației.

Acesta conține:

Drawable;

Layout;

Menu;

Values;

Drawable conține fișiere grafice pentru diferite tipuri de ecrane. Aici se salvează imaginile în format PNG.

Drawable este format din mai multe subdirectoare: drawble-hdpi, drawble-mdpi, drawble-xhdpi, drawble-xxhdpi.

Layout conține fișiere de interfața user care sunt utilizate de catre o activitate.

Values conține diferite tipuri de resurse , de exemplu: text string, culori etc.

Așa sunt prezentate în Android Studio(Figura 6):

Fig 6

Capitolul II:

Proiectarea aplicației

UML

UML este acronimul pentru Unified Modelling Language.

Acesta este un limbaj grafic de modelare foarte folositor în domeniul software pentru la realizarea de documente.

Este utilizat pentru: modelarea proceselor de afaceri, reprezentarea structurii unei aplicatii, descrierea arhitecturii unui sistem, surprinderea comportamentului unui sistem, modelarea structurilor de date sau pentru construirea unei specificații detaliate a unui sistem.

Reprezentarea se face utilizând elementele standard ale UML: notațiile și diagramele.

Notațiile sunt elemente ce se regasesc în cadrul fiecarei diagrame și sunt de tipul:

Conectori

Simboluri

Valori.

Diagramele sunt reprezentări ale unui proces, ale unui sistem sau ale părților lor componente.

Clasificarea diagramelor UML

Diagrame de comportament:

Diagrama cazurilor de utilizare;

Diagrama de activități;

Diagrama de stare;

Diagrame de interacțiune.

Diagrame de structură:

Diagrama de clase;

Diagrama de obiecte;

Diagrama de componente;

Diagrama de pachete.

Dintre acestea, eu am utilizat pentru a proiecta aplicația mea următoarele: Diagrama cazurilor de utilizare, Diagrama de activități, Diagrama de clase, Diagrama de obiecte.

Diagrame de comportament

Aceasta prezintă trăsăturile comportamentale ale sistemului.

Evidențiază componentele ce trebuie să existe în cadrul sistemului modelat.

Diagrama Cazurilor de Utilizare

Diagrama cazurilor de Utilizare descrie relațiile dintre utilizatori si sistem.

Fig 7

În Figura 7 „Utilizatorul” deschide aplicația (Manager Activități) și are 3 posibilități:

Încarcă;

Listă;

Îndrumător.

Fig 8

Această figură prezintă cele două cazuri de trimitere ale datelor în:

Baza de Date a Telefonului;

Baza de Date Online.

Fig 9

În momentul în care utilizatorul își vizualizează „Lista”, acesta poate să șteargă înregistrările pe care nu le mai dorește sau pe care le-a greșit.

Fig 10

Aici, Utilizatorul vizualizează „Îndrumător” (Help) care îl informează cum sa utilizeze aplicația., iar apoi ca să poată reveni la „Încarcă” sau „Listă” trebuie sa apese pe „Acasă” care se află tot în bara de meniu.

Diagrama de activități

Diagrama de activităși este o modalitate de modelare vizuală a fluxurilor. Cu ajutorul diagramei de activități se pot fi modela foarte bine use case-urile.

Fig 11

În Figura 11 am prezentat cum un Utilizator trebuie sa completeze câmpurile și ordinea în care trebuie să apese pe butoanele care salvează datele în Baza de Date.

Această ordine este foarte importantă și poate fi realizată în mai multe moduri:

Primul mod:

Se apasă pe butonul de trimitere date online dacă utilizatorul dorește să aibe informația respectivă salvată pe internet;

Apoi apasă pe butonul „Adaugă” ca să introducă datele și în Baza de Date a telefonului.

Al doilea mod:

Trimite datele respective doar online, deoarece consideră ca nu vrea să le dețină și în telefon.

Al treilea mod:

Trimite datele doar în memoria telefonului.

Diagrame de Structură

Prezintă elementele unei specificații independent de timp.

Evidențiază componentele ce trebuie să existe în cadrul sistemului modelat; sunt in general folosite pentru documentarea arhitecturii sistemelor software.

Diagrama de clase

Class Diagram este un tip de diagramă utilizată pentru descrierea structurii statice, adică a entităților sau claselor existente într-un sistem.

În Figura 12 este prezentat tabelul în care sunt salvate informațiile pe care le inserează utilizatorul.

Fig 12

Aceași formă are și tabelul din Baza de Date online cu excepția câmpurilor.

Acest tabel este prezentat în Figura 13.

Fig 13

Diagrama de obiecte

Object Diagram prezintă obiectele si relațiile dintre ele.

Fig 14

Această figură este asemănatoare cu Figura 12, doar că aceasta conține tabelul „contacts” cu câmpurile și obiectele aferente.

Fig 15

Figura 15 reprezintă un exemplu al bazei de date online. Aceasta conține obiectele inserate de către utilizator.

Capitolul III:

Crearea și explicarea aplicației

Adăugarea obiectelor pe interfața aplicației

Aplicația „Manager Activități” are 3 Layout-uri și anume:

Primul layout: activity_main.xml;

Al doilea layout: listview_item.xml;

Al treilea layout: informatii_indrumator.xml

Prima pagină a aplicației (activity_main.xml)

Aici am adăugat urmatoarele obiecte:

Linear Layout: care conține tot ce se afla în pagină;

Tab Host: acesta permite comutarea intre 2 layout-uri;

Linear Layout: care conține:

TabWidget: sunt butoanele Tab Host-ului;

FrameLayout

Linear Layout: care va conține:

TextView: titlul aplicației;

EditText: nume;

EditText: număr telefon;

EditText: email;

EditText: adresă;

EditText: descriere;

Linear Layout: care conține:

TextView: data;

Button: acesta setează data;

Button: acesta adaugă datele in baza de date a telefonului;

Linear Layout care va conține:

ListView

Toate acestea sunt evidențiate în Figura 16 de mai jos.

Fig 16

Proprietățile obiectelor

Linear Layout

Acesta conține toate obiectele interfeței .

El are urmatoarele proprietăți:

android:layout_width="match_parent";

android:layout_height="match_parent"

android:orientation="vertical"

Match_parent este o valoare specială folosită pentru lățime și înălțime și înseamnă că este cât părintele.

Vertical aranjează toate obiectele din Linear Layout pe verticală.

Tab Host

Acesta este un container pentru tabbed window view care conține 2 zone: TabWidget și FrameLayout .

El are urmatoarele proprietăți:

android:layout_width="fill_parent";

android:layout_height="fill_parent";

android:id="@+id/tabHost";

android:layout_gravity="center_horizontal";

android:clickable="false".

Center_horizontal plasează obiectul în zona centrală pe orizontală.

Clickable="false" definește dacă acest view rea informatii_indrumator.xml

Prima pagină a aplicației (activity_main.xml)

Aici am adăugat urmatoarele obiecte:

Linear Layout: care conține tot ce se afla în pagină;

Tab Host: acesta permite comutarea intre 2 layout-uri;

Linear Layout: care conține:

TabWidget: sunt butoanele Tab Host-ului;

FrameLayout

Linear Layout: care va conține:

TextView: titlul aplicației;

EditText: nume;

EditText: număr telefon;

EditText: email;

EditText: adresă;

EditText: descriere;

Linear Layout: care conține:

TextView: data;

Button: acesta setează data;

Button: acesta adaugă datele in baza de date a telefonului;

Linear Layout care va conține:

ListView

Toate acestea sunt evidențiate în Figura 16 de mai jos.

Fig 16

Proprietățile obiectelor

Linear Layout

Acesta conține toate obiectele interfeței .

El are urmatoarele proprietăți:

android:layout_width="match_parent";

android:layout_height="match_parent"

android:orientation="vertical"

Match_parent este o valoare specială folosită pentru lățime și înălțime și înseamnă că este cât părintele.

Vertical aranjează toate obiectele din Linear Layout pe verticală.

Tab Host

Acesta este un container pentru tabbed window view care conține 2 zone: TabWidget și FrameLayout .

El are urmatoarele proprietăți:

android:layout_width="fill_parent";

android:layout_height="fill_parent";

android:id="@+id/tabHost";

android:layout_gravity="center_horizontal";

android:clickable="false".

Center_horizontal plasează obiectul în zona centrală pe orizontală.

Clickable="false" definește dacă acest view reacționează la click events .

TabWidget

Afișează lista fiecărui tab în parte.

TextView

Acesta afișează un anumit text, în cazul meu el reprezintă titlul aplicaței.

El are urmatoarele proprietăți:

android:text="Activități": este textul afișat;

android:textStyle="bold|italic": are stilul bold și italic;

android:textColor="#ff8800": este culoarea scrisului;

android:textSize="30dp": este dimensiunea scrisului;

Dp este dimensiunea definită în xml.

EditText – Nume

Este un Text Field în care se pot scrie date. În cazul meu aici se va insera numele pentru fiecare activitate

Acesta conțin:

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:inputType="textPersonName"

android:ems="10"

android:id="@+id/txtName"

android:layout_marginTop="15dp"

android:hint="Nume Contact/Activitate"

android:textColor="#ff1d99ff"

android:typeface="normal"

TextPersonName este o proprietate care lasă utilizatorul sa insereze numele unei persoane.

Layout_marginTop este o proprietate care seteaza obiectul la o distanță de „15dp” față de marginea de sus.

Hint este proprietatea care atâta timp cât in căsuță nu este scris nimic sa apară ce i-am atribuit (în cazul meu „Nume Contact/Activitate”) .

EditText – Telefon

Conține următorarele proprietăți:

android:inputType="phone";

android:ems="10";

android:maxLength="10";

android:hint="Număr Telefon".

Phone este o proprietate care lasă utilizatorul să introducă un număr de telefon.

Ems este o unitate de măsură care face EditText-ul să fie exact câte lățimi ems sunt scrise.

MaxLenght este un filtru care îl constrânge pe utilizator să introducă un numar maxim ( în cazul meu maxim 10 cifre) .

EditText – Email

Conține:

android:inputType="textEmailAddress";

android:hint="Email".

TextEmailAddress este o proprietate care îl lasă pe utilizator să insereze o adresă de email.

EditText – Adresă

android:hint="Adresă";

android:inputType="textPostalAddress".

TextPostalAddress este o proprietate care îl lasă pe utilizator să insereze o adresă.

EditText – Descriere

Conține:

android:inputType="textMultiLine";

android:hint="Descriere…";

android:maxHeight="80dp".

TextMultiLine este o proprietate care afișează textul inserat de utilizator pe mai multe linii.

MaxHeight îl lasă pe utilizator să vadă doar pe un anumit număr de linii ( în cazul meu valoarea este de„80dp”).

Button – Setează

Conține:

style="?android:attr/buttonStyleSmall";

android:layout_width="100dp";

android:textSize="20sp";

android:background="#ff1d99ff";

android:textColor="#ffffffff".

ButtonStyleSmall este o proprietate care afișează butonul la o mărime mică.

TextSize reprezintă mărimea scrisului („20sp”).

Sp este o mărime specifică fontului.

Background este culoarea de fundal a butonului.

TextColor este culoarea scrisului de pe buton.

Button – Adaugă

Conține:

android:layout_width="300dp";

android:enabled="false";

android:textSize="25sp"

android:layout_gravity="center_horizontal"

Enabled este o proprietate care face butonul să fie dezactivat până cand se îndeplinește o condiție (în cazul meu până cand se scrie ceva in Edittext-ul de la nume).

Acestea sunt prezentate astfel:

Fig 17

În Figura 17 am prezentat toate obiectele pe care le-am enumerat mai sus.

A doua pagină (listview_item.xml)

Aici am adăugat următoarele obiecte:

Linear Layout: care conține tot ce se afla în pagină și așează pe orizontală;

Linear Layout: care conține restul obiectelor și așează pe verticală:

TextView – Nume;

TextView – Nume Contact;

TextView – Telefon;

TextView – Telefon Contact;

TextView – Email;

TextView – Email Contact;

TextView – Adresă;

TextView – Adresă Contact;

TextView – Dată;

TextView – Data;

TextView – Descriere;

TextView – Descriere Contact/Activitate.

Așa sunt prezentate în Android Studio:

Fig 18

Proprietățile obiectelor

Linear Layout:

android:orientation="horizontal";

android:layout_width="fill_parent";

android:layout_height="wrap_content";

Linear Layout

android:orientation="vertical";

android:layout_width="fill_parent";

android:layout_height="wrap_content".

Despre Linear Layout am discutat mai sus la 1.1.1 Proprietățile obiectelor.

TextView – Nume

android:textAppearance="?android:attr/textAppearanceMedium";

android:text="Nume:";

android:id="@+id/textView";

android:layout_marginLeft="10dp";

android:textColor="#ff00ff09";

android:textStyle="bold".

TextAppearance este o proprietate care poate avea o anumită: culoare, mărime, stil. În

cazul meu are mărimea Medium .

TextView – Nume Contact

android:textAppearance="@style/Base.TextAppearance.AppCompat.Small";

android:text="Nume Contact";

android:id="@+id/contactName";

android:textColor="#ff1d99ff";

android:layout_marginLeft="30dp";

android:textStyle="bold".

În acest caz TextAppearance are alt tip de mărime și anume Small .

În acest textView va fi inserat Nume Contact din Baza de Date.

Restul obiectelor sunt asemănătoare, cu mici modificări, și anume denumirea lor se schimbă, așa cum sunt scrise mai sus.

Datorită faptului că am setat acest Layout ca Listă, toate aceste TextView-uri se vor repeta pentru fiecare înregistrare facută.

Acestea sunt prezentate astfel:

Fig 19

În Figura 19 am prezentat toate obiectele pe care le-am enumerat mai sus și forma în care vor apărea.

Pagina Îndrumător

Am introdus următoarele obiecte:

ScrollView: care conține

LinearLayout:

TextView.

În Figura 20 se văd toate obiectele pe care le-am folosit:

Fig 20

Proprietățile obiectelor din pagina Îndrumător

ScrollView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#ff8800"

ScrollView este un FrameLayout care mă ajută să adăug oricâte obiecte prin intermediul cărora să afișez cât mai multă informație făra a ma teme ca nu o pot vizualiza deoarece ecranul este prea mic. Acesta ajută la derularea în jos a Layout-ului pentru a vizualiza tot ce se află pe pagina respectivă.

LinearLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

android:layout_marginLeft="10dp"

android:layout_marginRight="10dp"

TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceLarge"

android:text="Manager Activități!"

android:id="@+id/textView7"

android:layout_gravity="center_horizontal"

android:textColor="#ffffffff"

android:textStyle="bold"

TextAppearance are ca proprietate mărimea Large .

Mai sunt multe TextView-uri dar sunt foarte asemănatoare, singura diferanță ar fi conținutul lor. De accea le voi prezenta în Figura 21.

Fig 21

Bara de Activități

Aplicația „Manager Activități” mai are bara de activități care este formată din 3 elemente:

denumirea aplicației;

butonul de trimitere date online;

butonul care conține încă două activități:

Îndrumător;

Acasă.

Aceste elemente sunt scrise în folderul menu -> menu_main.xml.

Fig 22

În Figura 22 am evidențiat locul unde sunt inserate elementele enumerate mai sus.

Denumirea aplicației

Aceasta este scrisă în AndroidManifest.xml într-un activity, astfel:

„ android:label="Manager Activități" ”

Butonul de trimitere date online

Acesta este un item scris în menu_main.xml, astfel:

„ <item android:id="@+id/refresh"

android:icon="@drawable/sincronizare"

android:orderInCategory="2"

app:showAsAction="always"

android:title="trimiteOnline" /> ”

Fig 23

Butonul din Figura 23 trimite datele scrise în TextView-uri online, într-o baza de date MYSQL. Acest buton este asemănător cu butonul „ Adaugă ”.

Icon este o proprietate care mă ajută să inserez o imagine în loc de un buton predefinit.

OrderInCategory este o proprietatea care mă ajută să poziționez butonul pe a doua poziție(în acest caz).

ShowAsAction cu proprietatea „always” plasează acest item de fiecare dată în bara de activități.

Butonul care conține două activități

El este reprezentat printr-o iconiță cu 3 puncte puse pe verticală de culoarea albă, ca în Figura 24:

Fig 24

Acesta este format din:

Îndrumător;

Acasă.

La apăsarea butonului va apărea o listă cu cele 2 activități, precum sunt reprezentate în Figura 25 :

Fig 25

Îndrumător este un item scris în menu_main.xml, astfel:

„<item android:id="@+id/action_indrumator"

android:title="Îndrumător"

android:orderInCategory="1"

app:showAsAction="never" /> ”

După cum am specificat și mai sus, OrderInCategoryajută la poziționarea elementelor din bara de activități, în acest caz pozițitonează elementul „Îndrumator” pe prima poziție .

ShowAsAction cu proprietatea „ never ” nu plasează itemul respectiv în bara de activități .

Acasă este un item scris tot în menu_main.xml:

„ <item android:id="@+id/action_acasa"

android:title="Acasă"

android:orderInCategory="2"

app:showAsAction="never"/> „

În aces caz, OrderInCategory cu valoarea 2, poziționeaza elementul Acasă pe poziția a doua din listă .

În Figura 26 am prezentat toate item-urile din bara de activități:

Fig 26

Explicarea aplicației

Declararea variabilelor

În Android Studio, declararea variabilelor am făcuto în MainActivity.java, care esteun fișier te tip java.

Pentru ca lucrez cu android-ul, declararea se face puțin diferit decat în mod normal în Java și anume:

Am scris, înainte de variabilă, tipul obiectului căruia vreau să-i atribui o variabilă, urmând să-i dau o denumire, de Exemplu:

EditText nameTxt ( primul cuvânt este tipul obiectului, urmat de noua variabilă pe care o voi folosi în cod);

Button btn;

Calendar calendar;

TextView lblData.

Atribuirea variabilelor

În acest limbaj este necesară atribuirea variabilelor deoarece trebuie compilatorul să știe care variabilă are legătură cu obiectul care se află pe interfată.

Pentru variabilele enumerate mai sus am:

nameTxt = (EditText) findViewById(R.id.txtName) unde txtName este id-ul editText-ului care se află pe interfață;

lblData = (TextView) findViewById(R.id.viewDate);

btn = (Button) findViewById(R.id.btnSet);

Mai există și varianta în care le combin pe cele două, astfel:

EditText nameTxt = (EditText) findViewById(R.id.txtName), funcționează la fel și ocupă mai puțin spațiu în linia de cod;

Button btn = (Button) findViewById(R.id.btnSet).

Dezactivarea butonului „Adaugă”

Am vrut să dezactivez butonul deoarece vroiam să am un anumit criteriu de căutare în lista mea de activități, de aceea am pus această opțiune.

Cum am realizat acest lucru?

În primul rând am adăugat pentru nameText un eveniment addTextChangedListener;

În evenimentul onTextChanged am verificat daca am am scris ceva în EditText-ul pentru nume.

„@Override

public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { addBtn.setEnabled(String.valueOf(nameTxt.getText()).trim().length() >0);}”

Utilizarea TabHostului

Fig 27

TabHost tabHost = (TabHost) findViewById(R.id.tabHost); – am declarat variabila tabHost de tip TabHost și am atribuito lui id-ului tabHost.

tabHost.setup(); – am apelat metoda setup.

TabHost.TabSpec tabSpec = tabHost.newTabSpec("creator");

tabSpec.setContent(R.id.tabCreator);

tabSpec.setIndicator("Încarcă");

tabHost.addTab(tabSpec);

Acesta este primul tab denumit Încarcă , unde eu scriu toate datele pe care vreau sa le introduc în baza de date (Figura 28).

Fig 28

tabSpec = tabHost.newTabSpec("list");

tabSpec.setContent(R.id.tabContactList);

tabSpec.setIndicator("Listă");

tabHost.addTab(tabSpec);

Acesta este al doilea tab denumit Listă, unde îmi afișează toate infomațiile introdu-se de mine așezate într-o listă (Figura 29).

Fig 29

Toast

Toast-ul furnizează un feedback despre o anumită operație afișată într-un popup, iar activitatea rămâne viszibilă și interactivă. Popup-ul are dimensiunea pe care o necesită mesajul respectiv.

În cazul meu l-am folosit pentru a-mi afișa Numele atunci când apăs pe butonul Adaugă.

Toast.makeText(getApplicationContext(), String.valueOf(nameTxt.getText()) + " a fost adaugat in Lista ta!", Toast.LENGTH_SHORT).show();

Clase

Aplicația mea este formată din 3 clase:

MainActivity.java;

Contact.java;

DatabaseHandler.

MainActivity conține:

o secvență de metode de apelare care pornește o activitate;

o secvență de metode de apelare care oprește o activitate.

În ea am introdus codul necesar precum și am apelat celelalte două clase .

Am creat o noua clasă Contact:

am dat click dreapta pe pachetul care conține fișiere java și anume com.cata.andreeacatalin.contactmanager (Figura 30);

Fig 30

i-am dat denumirea Contact (Figura 31)

Fig 31

Această clasă am folosito pentru a trimite datele din baza de date în Listă.

În această clasă am creat noi variabile, un constructor și am declarat geteri pentru fiecare variabilă.

Exemplu:

String _name – variabila pentru nume;

public String getName() { return _name; } – get-ul pentru Nume;

String _phone – variabila pentru telefon;

public String getPhone() {return _phone;} – get-ul pentru Telefon.

List

List este o colecție care menține o anumită ordine pentru elementele ei. Fiecare element al listei are un index. Pe baza indexului se poate accesa elementul respectiv.

Am declarat List, asfel:

List<Contact> Contacts = new ArrayList<Contact>();

Apoi am creat noi adaptori într-o nouă clasă pe care am denumito ContactListAdapter;

Am creat un nou Layout (click dreapta pe folderul layout -> New -> Layout resource file, Figura 32);

Fig 32

Acel Layout l-am denumit listview_item și am discutat anterior despre el și ce conține (Figura 33).

Fig 33

Am utilizat un constructor prin care am facut legătura cu listview_item.xml, asfel:

public ContactListAdapter() {

super (MainActivity.this, R.layout.listview_item, Contacts); }

Am mai creat o funcție care va prelua view-ul, iar apoi trebuie să returneze un element în ArrayList (Figura 34) ;

Fig 34

view = getLayoutInflater().inflate(R.layout.listview_item, parent, false);- l-am folosit pentru a crește view-ul ca să se vadă toate datele pe care le introduc;

TextView name = (TextView) view.findViewById(R.id.contactName); – am utilizat view deoarece acesta mă ajută să afișez datele legate prin contactName;

name.setText(currentContact.getName()); – acesta modifică TextView-ul respectiv în așa fel încât să apară datele din baza de date;

acest proces se repetă pentru toate TextView-urile mele;

return view; – pentru a avea loc tot ce am specificat mai sus.

Am utilizat o nouă funcție pentru a popula lista din listview_item.xml:

private void populateList() {

contactAdapter = new ContactListAdapter();

contactListView.setAdapter(contactAdapter);}

Această funcție o apelez în momentul în care apăs pe butonul „Adaugă”.

Baza de date

Am creat o nouă clasă urmând pașii pe care i-am enumerat mai sus la creearea clasei listview_item.xml pe care am denumito DatabaseHandler.

Pentru aceasta am avut nevoie să extind clasa: SQLiteOpenHelper.

SQLiteOpenHelper este o clasă care mă ajută să administrez baza de date.

Ce conține clasa DatabaseHandler.java

În această clasă am nevoie de:

O variabilă string care va conține

Versiunea bazei de date;

Denumirea bazei de date:

String DATABASE_NAME = "contactManager";

Denumirea tabelului:

TABLE_CONTACTS = "contacts";

Id:

KEY_ID = "id";

Nume:

KEY_NAME = "name";

Telefon:

KEY_PHONE = "phone";

Email:

KEY_EMAIL = "email";

Adresă:

KEY_ADDRESS = "address";

Descriere:

KEY_EDITOR_TEXT = "text_editor";

Dată:

KEY_DATE = "data";

Am nevoie de versiunea bazei de date deoarece:

dacă pe viitor modific structura bazei de date, să știu care versiune de bază de date trebuie să folosesc.

Funcția de creare a Tabelului

Am folosit o funție onCreate pentru a creea tabelul pentru baza de date împreună cu următoarea sintaxă SQL :

„ db.execSQL("CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_NAME + " TEXT," + KEY_PHONE + " TEXT," + KEY_EMAIL + " TEXT," + KEY_ADDRESS + " TEXT," + KEY_EDITOR_TEXT + " TEXT,"+ KEY_DATE + " TEXT)"); ”

Practic această sintaxă îmi crează Tabelul și câmpurile de care mai am nevoie:

KEY_ID : care este autoincrementat;

KEY_NAME: înregistrează Numele;

KEY_PHONE: înregistrează Telefonul;

KEY_EMAIL: înregistrează Emailul;

KEY_ADDRESS: înregistrează Adresa;

KEY_EDITOR_TEXT: înregistrează Descrierea;

KEY_DATE: înregistrează Data.

Funcția de modificare a Tabelului

Am folosit funția onUpgrade pentru a modifica datele din tabel împreună cu sintaxa specifică acesteia :

db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

Funcția de creare a Contactului

Utilizez metoda getWritableDatabase() (acestă metodă se află în SQLiteOpenHelper), deoarece aceasta mă ajută să scriu în câmpurile scrise mai sus din baza de date.

Apoi, folosesc (Figura 35):

values.put(KEY_NAME, contact.getName()); – acesta efectiv îmi arată locul unde mi se introduc datele pe care le apelez prin getName() și anume în câmpul KEY_NAME;

celelalte sunt la fel doar că specifică câmpurile respective de unde se introduc datele prin apelarea metodelor respective.

db.insert(TABLE_CONTACTS, null, values); – realizează inserarea datelor în câmpurile specificate anterior.

Fig 35

Funcția de citire a Contactului

Utilizez metoda getReadableDatabase() care ajută la citirea informațiilor introduse în baza de date.

„ Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, KEY_NAME, KEY_PHONE, KEY_EMAIL, KEY_ADDRESS, KEY_EDITOR_TEXT, KEY_DATE }, KEY_ID + "=?", new String[] { String.valueOf(id)} ,null ,null, null, null); ”

Acest cursor se va duce la fiecare dată scrisă și va selecta diferite chestii acolo(în funcție de ce îi atribui).

KEY_ID + "=?" – semnul întrebării înseamnă că în funcție de id-ul selectat, se va prelua contactul respectiv.

Apoi am nevoie de un Contact care mă va ajuta în a citii toate valoriile care au un id specific.

Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6));

Folosesc câte un cursor pentru fiecare informație din câmpurile pe care le am în baza de date și să le convertesc în string.

Funcția de ștergere a Contactului

Am utilizat o funție deleteContact pentru a șterge înregistrarea din baza de date.

Pentru aceasta am folosit din nou metoda de citire, getReadableDatabase() și apelez metoda de ștergere prin următoarea sintaxă:

„ db.delete(TABLE_CONTACTS, KEY_ID + "=?", new String[] { String.valueOf(contact.getId()) });

db.close(); ”

Am utilizat tot KEY_ID + "=?" pentru a șterge înregistrarea în funcție de id-ul pe care îl deșine.

Funcția de preluare date

Am folosit o funcție getContactsCount pentru a selecta datele din baza de date ca sa fie preluate.

Pentru aceasta am folosit din nou metoda de citire, getReadableDatabase() și apelez metoda de selectare prin următoarea sintaxă:

Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CONTACTS, null);

SELECT * – înseamnă ca selectează toate datele din câmpurile tabelului respectiv (TABLE_CONTACTS).

Butonul „Adaugă”

Acest buton folosește evenimentul onClick, care efectiv inserează datele scrise în EditText-uri în baza de date atunci când se va apăsa pe el.

Pentru asta am scris următorul cod:

„ Contact contact = new Contact(dbHandler.getContactsCount(), String.valueOf(nameTxt.getText()), String.valueOf(phoneTxt.getText()), String.valueOf(emailTxt.getText()), String.valueOf(addressTxt.getText()), String.valueOf(editorTxt.getText()), String.valueOf(lblData.getText())); ”

Astfel, sunt preluae informațiile scrise în EditText-uri.

Am mai adăugat o condiție care să nu ma lase să introduc mai multe înregistrări cu același Nume.

„ if (!contactExists(contact))

dbHandler.createContact(contact);

Contacts.add(contact);

contactAdapter.notifyDataSetChanged();

Toast.makeText(getApplicationContext(), String.valueOf(nameTxt.getText()) + " a fost adaugat in Lista ta!", Toast.LENGTH_SHORT).show();

nameTxt.setText("");

phoneTxt.setText("");

emailTxt.setText("");

addressTxt.setText("");

editorTxt.setText("");

return;

}

Toast.makeText(getApplicationContext(), String.valueOf(nameTxt.getText()) + " Contactul exista. Te rog utilizeaza un nume diferit ", Toast.LENGTH_SHORT).show();

dbHandler.createContact(contact); – creez contactul;

Contacts.add(contact); – adaugă contactul în listă;

contactAdapter.notifyDataSetChanged(); – notifică atunci când data a fost modificată( în cazul meu atunci când amșters ceva din baza de date);

nameTxt.setText(""); – setează textul din EditText-ul nameTxt să fie gol după apăsarea butonului (asta semnifică ""). La fel se procedează și pentru restul Edittext-urilor.

Ștergerea Contactului

Am utilizat metoda onCreateContextMenu care creează meniul atunci când țin apăsat pe un contact ca să-l șterg.

„ menu.setHeaderIcon(R.drawable.edit_pencil);

menu.setHeaderTitle("Optiunile Contactului");

menu.add(Menu.NONE, DELETE, menu.NONE, "Stergere Contact"); ”

menu.setHeaderIcon(R.drawable.edit_pencil); – setează o iconță pe meniul care apare la apăsarea unui contact;

menu.setHeaderTitle("Optiunile Contactului"); – setează un titlu meniului și anume Optiunile Contactului;

menu.add(Menu.NONE, DELETE, menu.NONE, "Stergere Contact"); – este opțiunea pentru ștergere.

Acestea sunt prezentate în Figura 36:

Fig 36

Iconița edit_pencil am downloadato de pe site-ul http://www.iconarchive.com/ , cu mărimea de 48 pixeli. Programul acceptă denumirea iconiței cu litere mici și underscore, altfel dă erori.

Am copiat iconița în folderul drawble (Figura 37):

Fig 37

Am utilizat metoda onContextItemSelected(MenuItem item) care preia id-ul opțiuni selectate , în acest momentul am doar o singură opțiune dar pe viitor va mai fi încă o opțiune pentru modificarea contactului.

În interiorul acestei metode am scris:

„ switch (item.getItemId()){

case DELETE:

dbHandler.deleteContact(Contacts.get(longClickedItemIndex));

Contacts.remove(longClickedItemIndex);

contactAdapter.notifyDataSetChanged();

break;} ”

Atunci când este selectată opțiunea Stergere Contact , ea va ștege datele din baza de date. Prin intermediul acestei linii de cod contactAdapter.notifyDataSetChanged(); scrise in butonul Adaugă, datele se vor șterge și din Listă.

Date Picker

Am atributul DatePicker_datePickerMode care este setat pe calendar astfel încât luna și ziua sa fie selectate în stilul calendar, iar anul poate fi selectat separat din listă.

În acest caz utilizez:

DateFormat formate = DateFormat.getDateInstance();

Calendar calendar = Calendar.getInstance();

TextView lblData;

getDateInstance(; – returnează un format de dată ca să fie convertit în stilul specific.

getInstance() – returnează un format de dată pentru stilul SHORT

Am utilizat:

DatePickerDialog.OnDateSetListener d = new DatePickerDialog.OnDateSetListener()

Am folosit o metodă: onDateSet prin care setez :

anul;

luna;

ziua.

Le-am scris astfel:

calendar.set(Calendar.YEAR, year);

calendar.set(Calendar.MONTH, monthOfYear);

calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);

Am folosit o noua metodă setDate() – prin care se afișează Date Picker-ul și se preia anul, luna și ziua din acesta;

Codul folosit:

new DatePickerDialog(MainActivity.this, d, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH) ).show();

Modificarea datei din TextView se face prin metoda updatedate(), astfel:

lblData.setText(formate.format(calendar.getTime()));

Interfața Date Picker-ului meu este cea din Figura 38.

Fig 38

Baza de date Online

Pentru a trimite si vizualiza datele online, am avut nevoie de un server prin care să verific dacă ajung datele la destinație. În acest caz am folosit programul XAMP.

Fig 39

Am pornit server-ul Apache și server-ul MYSQL.

Crearea bazei de date online

Am intrat în localhost prin adresa http://localhost:8080/phpmyadmin/index.php ;

Am creat o noua Bază de Date: click pe New -> am scris numele noi baze de date „dbapp” -> click pe Creează (Figura 40);

Fig 40

Am creat un tabel în baza de date pe care l-am numit contacts și conține:

Id – este autoincrementat;

name;

email;

adresă;

descriere;

data.

Câmpurile trebuie sa fie identice cu cele din baza de date SQLite.

Am verificat conexiunea printr-o Extensie a celor de la Google Chrome numită POSTMAN

Fig 41

Se observă în Figura 41 că inițial am testat cu doar un câmp și anume name.

Astfel, am verificat dacă conexiunea se realiza cu succes și dacă ajungeau datele la destinație.

PHP

Am nevoie de un fișier php prin intemediul căruia să inserez datele din EditText-urile telefonului în câmpurile pe care le-am creat în baza de date de pe localhost.

Pentru a scrie cod PHP am utilizat un alt program numit SublimeText.

Acest cod l-am salvat într-un fișier denumit Insert.php.

Codul pentru stabilierea Host-ului, User-ului, Parola și Baza de date:

define("DB_HOST", "localhost");

define("DB_USER", "root");

define("DB_PASSWORD", "");

define("DB_DATABASE", "dbapp");

Conexiunea cu MYSQL:

$con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);

Selectarea bazei de date:

mysql_select_db(DB_DATABASE);

Realizarea unui POST între câmpurile din baza de date MQSQL si baza de date SQLite:

$name= $_POST['name'];

$email=$_POST['email'];

$adresa=$_POST['adresa'];

$descriere=$_POST['descriere'];

$data=$_POST['data'];

Sintaxa pentru inserarea datelor în baza de date MYSQL:

mysql_query("insert into contacts(name, email, adresa, descriere, data) values ('{$name}','{$email}','{$adresa}','{$descriere}','{$data}') ");

Închiderea conexiunii cu baza de date:

mysql_close();

Realizarea conexiunii în MainActivity

Am creat o nouă clasă în MainActivity pe care am denumito InsertOperation cu extindere AsyncTask<String, Void, String>

Am folosit o metodă numită doInBackground prin care am:

definit un HttpClient:

HttpClient httpclient = new DefaultHttpClient();

definit un HttpPost:

HttpPost httppost = new HttpPost("http://192.168.1.102:8080/androidapp/Insert.php");

Prin aceasta am realizat conexiunea cufișierul php enunțat mai sus.

creat o listă prin care adaug datele atribuindu-le câte un parametru:

nameValuePairs.add(new BasicNameValuePair("name", params[0]));

execut un HttpResponse:

HttpResponse response = httpclient.execute(httppost);

Am apelat o metodă onPostExecute pentru a afișa numele activității prntr-un Toast, deoarece așa văd dacă se funcționează metoda doInBackground :

Toast.makeText(getApplicationContext(), String.valueOf(nameTxt.getText()) + " a fost adaugat in Baza de date Online!", Toast.LENGTH_SHORT).show();

Am creat o nouă metodă pe care am numito insertDB();

Prin aceasta preiau informațiile din EditText-uri la apăsarea butonului(Figura 42):

Fig 42

Sintaxa:

new InsertOperation().execute(nameTxt.getText().toString(), emailTxt.getText().toString(), addressTxt.getText().toString(), editorTxt.getText().toString(), lblData.getText().toString());

Iar metoda insertDB() este apelată atunci când este apasat acel buton.

Nu în ultimul rând, am adăugat o permisiune în AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

Aceasta permite aplicației accesul la internet.

Stilizarea Activity Bar

În folderul values este un fișier care se numește strings.xml. Acesta conține denumirea aplicației care apare pe bara de activități.

Fig 43

În Figura 43 se observă că denumirea aplicației are fontul bolduit, italic și underline.

Am scris în fișierul strings.xml următorul cod:

<string name="app_name"><b><u><i>Manager Activități</i></u></b></string>

În fișierul styles.xml am atribuită tema aplicației și modificarea adusă la bara de activități:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

<item name="android:actionBarStyle">@style/MyActionBar</item>

<item name="actionBarStyle">@style/MyActionBar</item>

</style>

Am scris tema aplicației, iar apoi apelez MyActionBar care am scriso mai jos, pentru a stiliza bara de activități.

<style name="MyActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">

<item name="background">@color/actionbar_background</item>

</style>

Am creat un nou fișier în Values pe care l-am denumit colorsBar.xml, în care am introdus codul de mai jos

<color name="actionbar_background">#ff8800</color>

Acesta conține culoarea #ff8800 (portocaliu).

Concluzii și propuneri

Aplicația este folositoare pentru toate categoriile de vârstă, al cărui telefon are versiunea android de minim 3.0 .

După cum am prezentat anterior, această aplicație îl ajută pe utilizator să înregistreze diferite activități în funcție de dată, exact ca și o agendă.

Pe viitor aș dori să modific aplicația în așa fel încât, utilizatorul sa primească o notificare atunci când activitatea înregistrată pe o anumită dată să apară în bara de meniu a telefonului. M-am mai gândit să mai adaug un câmp care să conțina ora la care se dorește să se declanșeze acea activitate. Declanșarea să se facă asemănător ca o alarmă normală, cu o melodie sau prin vibrații.

Mai mult decât atât, vreau să-i adaug și partea de modificare a unei înregistrări deja existente, atât în memoria telefonului cât și în mediul online.

Nu în ultimul rând, mai vreau să fac aplicația să trimită, la un interval de timp, un backup al bazei de date din telefon către baza de date online, astfel încât dacă se întâmplă ceva cu telefonul respectiv iar înregistrările sunt foarte importante acestea să fie salvate online.

Bibliografie

Sams Teach Yourself Android Application Development in 24 Hours SE_2012 0672335697

http://webspace.ulbsibiu.ro/sorin.negulescu/media/curs_is/uml.pdf

Lect. Univ. Dr. Ramona-Mihaela PAUN, „MODELAREA PROCESELOR DE AFACERI UTILIZAND UML”

Modelarea proceselor de afaceri cu ajutorul UML

http://webspace.ulbsibiu.ro/sorin.negulescu/media/curs_is/uml.pdf

http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html

http://developer.android.com/reference/android/widget/LinearLayout.html

http://developer.android.com/reference/android/view/Gravity.html

http://developer.android.com/reference/android/view/View.html

http://developer.android.com/reference/android/widget/TabWidget.html

http://developer.android.com/reference/android/widget/TextView.html

http://developer.android.com/guide/topics/resources/more-resources.html#Dimension](http://developer.android.com/guide/topics/resources/more-resources.html#Dimension)

http://developer.android.com/reference/android/widget/EditText.html

http://developer.android.com/reference/android/widget/TextView.html#attr_android:minEms

http://developer.android.com/reference/android/widget/TextView.html#attr_android:maxHeight

http://stackoverflow.com/questions/2025282/difference-between-px-dp-dip-and-sp-in-android

http://developer.android.com/reference/android/widget/TextView.html#attr_android:textAppearance

https://developer.android.com/reference/android/widget/ScrollView.html

https://developer.android.com/training/basics/actionbar/adding-buttons.html

http://developer.android.com/guide/topics/resources/menu-resource.html

http://developer.android.com/guide/topics/ui/notifiers/toasts.html

http://developer.android.com/training/basics/activity-lifecycle/starting.html

http://developer.android.com/reference/java/util/List.html

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase()

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getReadableDatabase()

http://stackoverflow.com/questions/17361848/cursor-index-exception-in-android-sqlite

http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

https://developer.android.com/reference/android/widget/DatePicker.html

http://developer.android.com/reference/java/text/DateFormat.html#getDateInstance()

http://developer.android.com/reference/java/text/DateFormat.html#getInstance()

https://developer.android.com/training/basics/actionbar/styling.html#CustomTabs

https://developer.android.com/reference/android/R.attr.html#background

Bibliografie

Sams Teach Yourself Android Application Development in 24 Hours SE_2012 0672335697

http://webspace.ulbsibiu.ro/sorin.negulescu/media/curs_is/uml.pdf

Lect. Univ. Dr. Ramona-Mihaela PAUN, „MODELAREA PROCESELOR DE AFACERI UTILIZAND UML”

Modelarea proceselor de afaceri cu ajutorul UML

http://webspace.ulbsibiu.ro/sorin.negulescu/media/curs_is/uml.pdf

http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html

http://developer.android.com/reference/android/widget/LinearLayout.html

http://developer.android.com/reference/android/view/Gravity.html

http://developer.android.com/reference/android/view/View.html

http://developer.android.com/reference/android/widget/TabWidget.html

http://developer.android.com/reference/android/widget/TextView.html

http://developer.android.com/guide/topics/resources/more-resources.html#Dimension](http://developer.android.com/guide/topics/resources/more-resources.html#Dimension)

http://developer.android.com/reference/android/widget/EditText.html

http://developer.android.com/reference/android/widget/TextView.html#attr_android:minEms

http://developer.android.com/reference/android/widget/TextView.html#attr_android:maxHeight

http://stackoverflow.com/questions/2025282/difference-between-px-dp-dip-and-sp-in-android

http://developer.android.com/reference/android/widget/TextView.html#attr_android:textAppearance

https://developer.android.com/reference/android/widget/ScrollView.html

https://developer.android.com/training/basics/actionbar/adding-buttons.html

http://developer.android.com/guide/topics/resources/menu-resource.html

http://developer.android.com/guide/topics/ui/notifiers/toasts.html

http://developer.android.com/training/basics/activity-lifecycle/starting.html

http://developer.android.com/reference/java/util/List.html

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase()

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getReadableDatabase()

http://stackoverflow.com/questions/17361848/cursor-index-exception-in-android-sqlite

http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

https://developer.android.com/reference/android/widget/DatePicker.html

http://developer.android.com/reference/java/text/DateFormat.html#getDateInstance()

http://developer.android.com/reference/java/text/DateFormat.html#getInstance()

https://developer.android.com/training/basics/actionbar/styling.html#CustomTabs

https://developer.android.com/reference/android/R.attr.html#background

Similar Posts