Semplifica lo sviluppo di app Android con Anko

Progettato da JetBrains, l'organizzazione che sta dietro Kotlin, Anko è una libreria open-source che può cambiare radicalmente il modo in cui crei le app Android. Sfrutta la sintassi di Kotlin per offrire una vasta collezione di funzioni di supporto che ti aiutano a ridurre la verbosità del tuo codice migliorando allo stesso tempo le sue prestazioni.

Anko funge anche da DSL, abbreviazione di linguaggio specifico del dominio, per la creazione di layout Android. In altre parole, può agire come alternativa al tipo, sicura, dinamica e più riutilizzabile ai file XML di layout, che, come forse già sapete, tendono a diventare ingombranti per le app di grandi dimensioni.

In questo tutorial, ti aiuterò ad iniziare con Anko mostrandoti come utilizzare alcune delle sue funzionalità più popolari.

1. Impostazione del progetto

Per poter utilizzare le funzionalità principali di Anko nel progetto Android Studio, è sufficiente aggiungere quanto segue implementazione dipendenza nel App modulo di build.gradle file:

implementazione 'org.jetbrains.anko: anko: 0.10.1'

Se vuoi che Anko lavori con i widget delle librerie di supporto di Android, tuttavia, avrai bisogno delle seguenti dipendenze aggiuntive:

implementazione 'org.jetbrains.anko: anko-appcompat-v7: 0.10.1' implementazione 'org.jetbrains.anko: anko-design: 0.10.1' implementazione 'org.jetbrains.anko: anko-recyclerview-v7: 0.10. 1 'implementazione' org.jetbrains.anko: anko-cardview-v7: 0.10.1 '

2. Creazione di layout

Anko DSL ha funzioni di supporto per quasi tutti i widget offerti dall'SDK Android e dalle librerie di supporto Android. Usandoli, puoi creare i tuoi layout a livello di programmazione. I nomi delle funzioni corrispondono ai nomi dei widget, ma iniziano con una lettera minuscola. Ad esempio, per creare a TextView widget, usi Anko textView () funzione. Allo stesso modo, per creare un FloatingActionButton widget, puoi usare il floatingActionButton () funzione.

All'interno delle funzioni, avrai accesso a tutte le proprietà e agli ascoltatori di eventi dei widget associati. Ad esempio, puoi modificare la dimensione del testo di a TextView widget aggiornando il valore di dimensione del testo proprietà all'interno del textView () funzione. Allo stesso modo, puoi aggiungere un listener di eventi on-click usando il al clic metodo.

Per aiutarti a capire meglio come utilizzare la DSL, ecco un esempio di layout per un'app browser contenente un file Modifica il testo widget e a WebView widget posizionato all'interno di a LinearLayout widget il cui orientamento è VERTICALE:

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

Il codice scritto in Anko DSL è molto leggibile e intuitivo, ma ci vuole un po 'di tempo per abituarsi, specialmente se sei già uno sviluppatore Android esperto. Non devi più assegnare identificatori ai tuoi widget o utilizzare il findViewById () metodo per farvi riferimento, perché a differenza dei layout basati su XML, i layout basati su DSL di Anko possono incapsulare la logica di business della vostra app. Ad esempio, puoi vedere che il Modifica il testo il widget definito sopra ha un OnEditorAction ascoltatore di eventi che chiama direttamente il loadURL () metodo del WebView widget per caricare l'URL digitato dall'utente.

Inoltre, non è necessario chiamare il setContentView () metodo più perché Anko lo chiama automaticamente dentro il tuo Attività La classe di onCreate () metodo.

DSL include diverse scorciatoie da utilizzare per rendere più concisi i tuoi layout. Ad esempio, è possibile passare direttamente le stringhe alle sue funzioni per assegnare etichette ai widget. Spesso, puoi anche evitare di impostare in modo esplicito parametri di layout come larghezze e altezze perché li gestisce automaticamente. Il seguente codice di esempio mostra come creare un layout contenente due TextView widget in modo molto conciso:

verticalLayout textView ("One") textView ("Two")

Per fare un confronto, ecco come apparirebbe il layout sopra se fosse stato creato convenzionalmente:

    

Infine, vale la pena ricordare che i layout creati usando la DSL Anko tendono a caricarsi più velocemente dei normali layout perché non è richiesto alcun parsing XML.

3. Creazione di finestre di dialogo

Se pensi di usare il AlertDialog.Builder la classe per creare dialoghi è un sacco di lavoro, non sei assolutamente solo. Ad esempio, ecco come si creerebbe normalmente una semplice finestra di dialogo che visualizza un titolo, un messaggio e un pulsante "OK":

AlertDialog.Builder (this @ MyActivity) .setTitle ("My Dialog") .setMessage ("Questo è un messaggio di prova") .setPositiveButton ("OK", null) .create () .show ()

Con Anko, tuttavia, la creazione della finestra di dialogo sopra comporta semplicemente una chiamata a mettere in guardia() funzione, che accetta il titolo e il messaggio della finestra di dialogo come argomenti.

alert ("Questo è un messaggio di prova", "My Dialog") yesButton  .show ()

Si noti che non è necessario passare un contesto al mettere in guardia() funzione. Induce automaticamente il contesto.

Anko ha le stesse funzioni intuitivamente denominate per aiutarti a creare rapidamente anche toast e snack bar. Il seguente codice mostra come creare sia toasts short che long duration:

toast ("Questo è un breve brindisi") longToast ("E questo è un lungo brindisi")

4. Creazione di intenti

Ogni volta che devi avviare una nuova attività nella tua app, devi creare un intent. Inoltre, se si desidera inviare dati all'attività, è necessario includerli nell'intento come uno o più extra. 

Con Anko's startActivity () funzione, in genere è possibile eseguire entrambe le attività in una sola riga di codice. Ad esempio, il codice seguente mostra come avviare un'attività denominata MyActivity e passare due extra, una stringa extra denominata "PERSON" e un intero extra denominato "AGE", ad esso:

startActivity("PERSONA" in "Mario", "ETÀ" in 25)

Anko ha anche funzioni di supporto per diversi compiti basati sugli intenti comuni. Ad esempio, puoi usare il suo navigare() funzione per aprire un URL nell'app browser predefinita del dispositivo. Allo stesso modo, puoi usare il e-mail() funzione per aprire l'app email predefinita e comporre un'email.

// Apri browser browse ("https://tutsplus.com") // Apri l'e-mail predefinita per l'app di posta elettronica ("[email protected]", "Ciao", "Questa è una email di prova")

5. Utilizzo dei database SQLite

Anche se ogni app Android può creare e utilizzare database SQLite senza dipendenze aggiuntive, molti sviluppatori scelgono database di terze parti come Realm. Perché? Beh, forse è perché l'API SQLite di Android è estremamente prolissa, di basso livello e richiede una buona conoscenza di SQL. Fortunatamente, Anko dispone di funzioni di supporto SQLite per risolvere tutti questi problemi.

Diciamo che abbiamo un semplice database SQLite creato usando il seguente codice:

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

Con Anko, puoi ora aggiungere una tabella al database sopra semplicemente usando il crea tabella() funzione, che si aspetta il nome della tabella insieme a una o più tuple che specificano i nomi e i tipi di dati delle sue colonne. Il seguente codice di esempio crea una tabella denominata PERSONA con quattro colonne, una delle quali funge da chiave primaria:

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

Inoltre, per inserire righe nella tabella, non devi più dipendere da ContentValues ​​() classe. Puoi chiamare direttamente il inserire() funzione sul database, specificare il nome della tabella a cui si desidera aggiungere la riga e quindi passare i valori della colonna ad essa sotto forma di tuple.

// Aggiungi una riga myDB.insert ("PERSON", "NAME" a "Bob Martin", "AGE" a 25, "NET_WORTH" a 2500.50, "ID" a 100) // Aggiungi un'altra riga myDB.insert (" PERSON "," NAME "a" Jane Flores "," AGE "a 32," NET_WORTH "a 21500.80," ID "a 101)

Infine, per interrogare il database, è possibile utilizzare il selezionare() funzione, opzionalmente seguita da una catena di funzioni nominate intuitivamente come whereSimple (), ordinato da(), e raggruppa per(). Ad esempio, per elencare i nomi e le età di tutte le persone nella tabella sopra il cui valore netto è maggiore di 10000, puoi usare il seguente codice:

myDB.select ("PERSON", "NAME", "AGE") .whereSimple ("NET_WORTH>?", "10000.0"). exec // Altro codice qui

Il risultato della suddetta query sarà, come ci si potrebbe aspettare, a Cursore oggetto. Convertendolo in a Elenco contenere i valori effettivi delle colonne di tutte le righe è leggermente più complicato perché implica la creazione di un oggetto che implementa il file RowParser interfaccia e passandolo al parseList () funzione.

Il RowParser l'interfaccia ha solo un metodo, il parseRow () metodo, all'interno del quale avrai accesso ai valori della colonna di una riga. Il modo in cui usi i valori è, naturalmente, a te. Per ora, concateniamoli e stampali. Il seguente codice mostra come farlo:

parseList (oggetto: RowParseroverride fun parseRow (columns: Array): String // Concatena i valori della prima e della seconda colonna, // che risulta essere NAME e AGE restituiscono "$ columns [0] ($ columns [1] anni)"). forEach println (it) // stampa i valori concatenati // Il risultato è: // Jane Flores (32 anni)

Si noti che non è sempre necessario creare un RowParser oggetto manualmente. Se i risultati della tua query contengono solo una colonna, sei libero di utilizzare uno dei molti parser integrati di Anko. 

I nomi dei parser integrati si basano sui tipi di dati delle colonne. Ad esempio, se il tipo di dati è TESTO, puoi usare a StringParser. O se il tipo di dati è NUMERO INTERO, puoi usare un IntParser. Il seguente codice mostra come usare a StringParser semplicemente elencare i nomi di tutte le persone nel nostro database:

myDB.select ("PERSON", "NAME"). exec parseList (StringParser) .forEach println (it) // Il risultato è: // Bob Martin // Jane Flores

Conclusione

In questo tutorial, hai imparato come utilizzare le funzioni DSL e helper di Anko per semplificare lo sviluppo di applicazioni Android. Hai anche visto come Anko semplifica le operazioni relative a SQLite. Spero che ora ti renderai conto di quanto sia ben pensata e utile la biblioteca.

A mio parere, se sei già competente su Kotlin, non c'è davvero alcun motivo per cui non dovresti usare Anko per migliorare ulteriormente la tua efficienza ed esperienza di sviluppo. Per saperne di più, fai riferimento alla sua wiki ufficiale.

E mentre sei qui, dai uno sguardo ad alcuni dei nostri altri post su Kotlin e lo sviluppo di app per Android!