Simplificați dezvoltarea aplicațiilor Android cu Anko

Proiectat de JetBrains, organizația din spatele Kotlin, Anko este o bibliotecă open-source care poate schimba radical modul în care creați aplicații Android. Acesta utilizează sintaxa lui Kotlin pentru a oferi o colecție largă de funcții de ajutor care vă ajută să reduceți verbositatea codului dvs., îmbunătățind în același timp performanța acestuia.

Anko se dublează ca un DSL, scurt pentru limba specifică domeniului, pentru crearea layouturilor Android. Cu alte cuvinte, acesta poate acționa ca o alternativă din punct de vedere al siguranței, dinamică și mai reutilizabilă pentru a structura fișierele XML, care, după cum probabil știți, au tendința de a deveni greu pentru aplicații mari.

În acest tutorial, vă ajut să începeți cu Anko vă arăt cum să utilizați unele dintre cele mai populare caracteristici.

1. Configurarea proiectului

Pentru a putea utiliza caracteristicile principale ale Anko în proiectul dvs. Android Studio, tot ce trebuie să faceți este să adăugați următoarele punerea în aplicare dependența în aplicaţia ale modulului build.gradle fişier:

implementare "org.jetbrains.anko: anko: 0.10.1 '

Dacă doriți ca Anko să lucreze cu widget-uri din bibliotecile de asistență Android, veți avea totuși următoarele dependențe suplimentare:

implementarea "org.jetbrains.anko: anko-appcompat-v7: 0.10.1" implementare "org.jetbrains.anko: anko-design: 0.10.1" implementare "org.jetbrains.anko: anko-reciclerview-v7: 0.10. 1 'implementare' org.jetbrains.anko: anko-cardview-v7: 0.10.1 '

2. Crearea de planuri

Anko DSL are funcții de ajutor pentru aproape fiecare widget oferit de SDK-ul Android și de bibliotecile de asistență Android. Folosindu-le, puteți să vă creați programele planificate. Numele funcțiilor se potrivesc cu numele widget-urilor, dar încep cu o literă mică. De exemplu, pentru a crea un TextView widget, folosiți Anko TextView () funcţie. În mod similar, pentru a crea un FloatingActionButton widget, aveți posibilitatea să utilizați floatingActionButton () funcţie.

În interiorul funcțiilor, veți avea acces la toate proprietățile și ascultătorii de evenimente ale widgeturilor asociate. De exemplu, puteți schimba dimensiunea textului a TextView widget prin actualizarea valorii Mărimea textului proprietate în interiorul TextView () funcţie. În mod similar, puteți adăuga un ascultător la eveniment pe care îl puteți folosi onClick metodă.

Pentru a vă ajuta să înțelegeți mai bine cum să utilizați DSL, iată un exemplu de aspect pentru o aplicație de browser, care conține un Editează textul widget și a WebView widget plasat în interiorul unui LinearLayout widget a cărui orientare este VERTICAL:

lineLayout orientare = LinearLayout.VERTICAL var myWebView: WebView? = null editText inputType = InputType.TYPE_TEXT_VARIATION_URI imeOptions = EditorInfo.IME_ACTION_GO onEditorAction _, _, _ -> myWebView? .loadUrl (text.toString ()) myWebView = webView webViewClient = WebViewClient ()

Codul scris în Anko DSL este foarte ușor de citit și intuitiv, dar nu este nevoie să vă obișnuiți, mai ales dacă sunteți deja un dezvoltator experimentat Android. Nu mai trebuie să alocați identificatori widget-urilor dvs. sau să utilizați findViewById () pentru a le referi - pentru că, spre deosebire de aspectele bazate pe XML, layout-urile DSL bazate pe Anko pot încapsula logica de afaceri a aplicației. De exemplu, puteți vedea că Editează textul widgetul definit mai sus are un OnEditorAction ascultător de evenimente care cheamă direct loadUrl () metodă a WebView widget pentru a încărca adresa URL introdusă de utilizator.

În plus, nu trebuie să apelați setContentView () deoarece Anko îl numește automat în interiorul dvs. Activitate clasa lui onCreate () metodă.

DSL include mai multe comenzi rapide pe care le puteți utiliza pentru a vă face machetele mai concise. De exemplu, puteți trece direct șiruri de caractere la funcțiile sale pentru a atribui etichete widget-urilor. De multe ori, puteți de asemenea să evitați să setați în mod explicit parametrii de aspect, cum ar fi lățimile și înălțimile, deoarece acestea le manipulează automat. Următorul exemplu de cod vă arată cum să creați un aspect care să conțină două TextView widget-uri într-un mod extrem de concis:

verticalLayout textView ("One") textView ("Două")

Pentru comparație, iată cum arată aspectul de mai sus dacă ar fi creat în mod convențional:

    

În cele din urmă, merită menționat faptul că structurile create folosind Anko DSL tind să se încarce mai repede decât layout-urile obișnuite, deoarece nu este necesară parsarea XML.

3. Crearea de dialoguri

Dacă credeți că utilizați AlertDialog.Builder clasa pentru a crea dialoguri este o mulțime de muncă, cu siguranță nu sunteți singuri. De exemplu, iată cum ați crea în mod normal un dialog simplu care afișează un titlu, un mesaj și un buton "OK":

AlertDialog.Builder (acest @ MyActivity) .setTitle ("My Dialog") .setMessage ("Acesta este un mesaj de test") .setPositiveButton ("OK", null) .create

Cu Anko, cu toate acestea, crearea dialogului de mai sus implică pur și simplu un apel către alerta() care acceptă titlul și mesajul dialogului drept argumente.

alertă ("Acesta este un mesaj de test", "Dialogul meu") yesButton  .show ()

Rețineți că nu este necesar să transmiteți un context către alerta() funcţie. Conferă automat contextul.

Anko are funcții similare numite intuitiv pentru a vă ajuta să creați rapid toasturi și snackbars prea. Următorul cod vă arată cum să creați toasturi scurte și lungi:

toast ("Acesta este un scurt toast") longToast ("Și acesta este un toast lung")

4. Crearea intențiilor

Ori de câte ori trebuie să începeți o nouă activitate în aplicația dvs., trebuie să creați o intenție. În plus, dacă doriți să trimiteți date către activitate, trebuie să o includeți în intenție ca unul sau mai multe extra. 

Cu Anko startActivity () puteți efectua ambele sarcini într-o singură linie de cod. De exemplu, următorul cod vă arată cum să lansați o activitate numită MyActivity și să treacă două extra-uri, un șir suplimentar numit "PERSON" și un număr întreg denumit "AGE", la acesta:

startActivity("PERSON" la "Bob", "AGE" la 25)

Anko are, de asemenea, funcții de ajutor pentru mai multe sarcini comune bazate pe intenții. De exemplu, puteți să o utilizați naviga() pentru a deschide o adresă URL în aplicația browser implicită a dispozitivului. În mod similar, puteți utiliza funcția e-mail() pentru a deschide aplicația implicită de e-mail și pentru a compune un e-mail.

// Deschideți navigarea prin browser ("https://tutsplus.com") // Deschideți e-mailul implicit pentru aplicația de e-mail ("[email protected]", "Bună ziua", "Acesta este un e-mail de test")

5. Utilizarea bazelor de date SQLite

Chiar dacă fiecare aplicație Android poate crea și utiliza baze de date SQLite fără dependențe suplimentare, mulți dezvoltatori aleg baze de date terțe, cum ar fi Realm. De ce? Ei bine, poate pentru că SQLite API-ul Android este extrem de verbos, de nivel scăzut și necesită o bună înțelegere a SQL. Din fericire, Anko are funcții SQLite helper pentru a rezolva toate aceste probleme.

Să presupunem că avem o bază de date SQLite simplă creată folosind următorul cod:

val myDB = openOrCreateDatabase ("test.db", Context.MODE_PRIVATE, null)

Cu Anko, acum puteți adăuga o masă la baza de date de mai sus pur și simplu folosind createTable () care așteaptă numele tabelului împreună cu unul sau mai multe, specificând numele și tipurile de date ale coloanelor sale. Următorul exemplu de cod creează un tabel numit PERSOANĂ având patru coloane, dintre care unul servește drept cheie primară:

myDB.createTable ("PERSON", true, "NAME" la TEXT, "AGE" la INTEGER, "NET_WORTH" la REAL, "ID" la INTEGER + PRIMARY_KEY)

În plus, pentru a insera rânduri în masă, nu mai trebuie să depindeți de ContentValues ​​() clasă. Puteți apela direct introduce() funcția din baza de date, specificați numele tabelului la care doriți să adăugați rândul și apoi treceți valorile coloanei la acesta sub formă de tupluri.

// Adăugați un rând myDB.insert ("PERSON", "NAME" la "Bob Martin", "AGE" la 25, "NET_WORTH" la 2500.50, "ID" la 100) PERSON "," NAME "la" Jane Flores "," AGE "la 32," NET_WORTH "la 21500.80," ID "la 101)

În cele din urmă, pentru a interoga baza de date, puteți utiliza Selectați() funcție, opțional urmată de un lanț de funcții numite intuitiv, cum ar fi whereSimple (), orderby (), și a se grupa cu(). De exemplu, pentru a lista numele și vârsta tuturor persoanelor din tabelul de mai sus, a căror valoare netă este mai mare decât 10000, puteți folosi următorul cod:

myDB.select ("PERSON", "NAME", "AGE") .whereSimple ("NET_WORTH>?", "10000.0"

Rezultatul interogării de mai sus va fi, după cum vă puteți aștepta, a Cursor obiect. Se transformă în a Listă conținând valorile coloanelor reale ale tuturor rândurilor este puțin mai complicată deoarece implică crearea unui obiect care implementează RowParser interfață și transmiterea acesteia către parseList () funcţie.

RowParser interfața are doar o singură metodă, parseRow () , în cadrul căruia veți avea acces la valorile coloanelor unui rând. Modul în care utilizați valorile este, desigur, la latitudinea dvs. Pentru moment, hai să le concatenăm și să le tipărim. Următorul cod vă arată cum să faceți acest lucru:

parseList (obiect: RowParsersuprascrie fun parseRow (coloane: Array): String // Concatenarea valorilor primei și celei de-a doua coloane, // care se întâmplă să fie NUME și vârsta înapoi "$ columns [0] ($ columns [1] ani)"). pentru fiecare println (it) // imprimați valorile concatenate // Rezultatul este: // Jane Flores (32 de ani)

Rețineți că nu trebuie întotdeauna să creați o RowParser obiect manual. Dacă rezultatele interogării dvs. conțin doar o singură coloană, aveți libertatea de a utiliza unul dintre cei mai importanți parseri ai Anko. 

Numele parserelor încorporate se bazează pe tipurile de date ale coloanelor. De exemplu, dacă tipul de date este TEXT, puteți utiliza a StringParser. Sau dacă tipul de date este ÎNTREG, puteți utiliza un IntParser. Următorul cod vă arată cum să utilizați a StringParser să menționăm pur și simplu numele tuturor persoanelor din baza noastră de date:

Selectați parseList (StringParser) .forEach println (it) // Rezultatul este: // Bob Martin // Jane Flores ("PERSON", "NAME"

Concluzie

În acest tutorial, ați învățat cum să utilizați funcțiile Anko DSL și helper pentru a simplifica dezvoltarea aplicațiilor Android. De asemenea, ați văzut cum Anko simplifică operațiile SQLite. Sper că acum înțelegeți cât de bine gândit și util este biblioteca.

După părerea mea, dacă sunteți deja competent în Kotlin, nu există niciun motiv pentru care să nu folosiți Anko pentru a-ți îmbunătăți în continuare eficiența și experiența de dezvoltare. Pentru a afla mai multe despre aceasta, faceți referire la wiki-ul său oficial.

Și în timp ce sunteți aici, verificați câteva dintre celelalte postări despre dezvoltarea și dezvoltarea aplicațiilor Android!


Cod