Forenkle Android App Utvikling Med Anko

Designet av JetBrains, organisasjonen bak Kotlin, er Anko et åpen kildebibliotek som radikalt kan endre måten du lager Android-apper på. Det utnytter Kotls syntaks for å tilby en stor samling av hjelpefunksjoner som hjelper deg med å redusere kodenes kjerne og samtidig forbedre ytelsen.

Anko dobler som en DSL, kort for domenespesifikt språk, for å lage Android-oppsett. Med andre ord kan det fungere som et type sikker, dynamisk og mer gjenbrukbart alternativ til layout XML-filer, som, som du kanskje allerede vet, pleier å bli uhåndterlig for store apper.

I denne veiledningen hjelper jeg deg med å komme i gang med Anko ved å vise deg hvordan du bruker noen av de mest populære funksjonene.

1. Prosjektoppsett

For å kunne bruke kjernegenskapene til Anko i Android Studio-prosjektet, er alt du trenger å gjøre, å legge til følgende gjennomføring avhengighet i app modulens build.gradle fil:

implementering 'org.jetbrains.anko: anko: 0.10.1'

Hvis du vil at Anko skal jobbe med widgets fra Androids støttebiblioteker, trenger du imidlertid følgende tilleggsavhengigheter:

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

2. Opprette layouter

Anko DSL har hjelpefunksjoner for nesten hver widget som tilbys av Android SDK og Android-støttebiblioteker. Ved å bruke dem kan du lage oppsettene dine programmatisk. Navnene på funksjonene samsvarer med navnene på widgets, men de starter med et lite bokstav. For eksempel, for å lage en TextView widget, bruker du Ankos textView () funksjon. Tilsvarende, for å lage en FloatingActionButton widget, kan du bruke floatingActionButton () funksjon.

Innenfor funksjonene har du tilgang til alle egenskapene og hendelseslytterne av tilhørende widgets. For eksempel kan du endre tekststørrelsen til a TextView widget ved å oppdatere verdien av tekststørrelse eiendom inne i textView () funksjon. På samme måte kan du legge til en klikkhendelse hendelseslytter til den ved hjelp av ved trykk metode.

For å hjelpe deg med å forstå hvordan du bruker DSL, er det et eksempel på en nettleserapp, som inneholder en EditText widget og a WebView widget plassert inne a LinearLayout widget hvis orientering er VERTICAL:

linearLayout orientation = 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 ()

Kode skrevet i Anko DSL er veldig lesbar og intuitiv, men det tar litt å bli vant til, spesielt hvis du allerede er en erfaren Android-utvikler. Du trenger ikke lenger å tilordne identifikatorer til widgets-eller bruke findViewById () Metode for å referere dem - fordi i motsetning til XML-baserte oppsett, kan Anks DSL-baserte oppsett inkapslere appens forretningslogikk. For eksempel kan du se at EditText widgeten definert ovenfor har en OnEditorAction hendelseslytter som direkte ringer til loadUrl () metode av WebView widget for å laste URLen brukeren skrev inn.

Videre trenger du ikke å ringe setContentView () metode lenger fordi Anko kaller det automatisk inni din Aktivitet klassens onCreate () metode.

DSL inkluderer flere snarveier du kan bruke til å gjøre layoutene dine mer konsise. For eksempel kan du direkte sende strenger til sine funksjoner for å tilordne etiketter til widgets. Ofte kan du også unngå å eksplisitt sette opp layoutsparametere som bredder og høyder fordi det håndterer dem automatisk. Følgende prøvekode viser hvordan du lager en layout som inneholder to TextView widgets på en svært kortfattet måte:

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

Til sammenligning, her er hva ovenstående layout ville se ut om det ble opprettet på vanlig måte:

    

Til slutt er det verdt å nevne at layouter opprettet ved hjelp av Anko DSL har en tendens til å laste raskere enn vanlige layouter fordi det ikke kreves XML-parsing.

3. Opprette dialogbokser

Hvis du tenker å bruke AlertDialog.Builder klasse for å skape dialoger er mye arbeid, du er definitivt ikke alene. For eksempel, her er hvordan du vanligvis lager en enkel dialog som viser en tittel, en melding og en "OK" -knapp:

AlertDialog.Builder (this @ MyActivity) .setTitle ("My Dialog") .setMessage ("Dette er en testmelding") .setPositiveButton ("OK", null) .create () .show ()

Med Anko oppretter imidlertid dialogboksen ovenfor bare en samtale til varsling() funksjon, som aksepterer dialogens tittel og melding som sine argumenter.

varsling ("Dette er en testmelding", "Min dialog") yesButton  .show ()

Merk at du ikke trenger å sende en kontekst til varsling() funksjon. Den gir inn i konteksten automatisk.

Anko har lignende intuitivt navngitte funksjoner for å hjelpe deg med å raskt lage toast og snackbars også. Følgende kode viser hvordan du lager både kort og langvarig toasts:

toast ("Dette er en kort toast") longToast ("Og dette er en lang skål")

4. Skape hensikter

Når du trenger å starte en ny aktivitet i appen din, må du opprette en hensikt. I tillegg, hvis du vil sende data til aktiviteten, må du inkludere den i hensikten som en eller flere tillegg. 

Med Ankos startActivity () funksjon, kan du vanligvis utføre begge oppgavene i bare én linje med kode. For eksempel viser følgende kode hvordan du starter en oppført aktivitet MyActivity og passere to ekstraelementer, en streng ekstra med navnet "PERSON" og et heltall som heter "AGE", til det:

startActivity("PERSON" til "Bob", "ALDER" til 25)

Anko har også hjelpefunksjoner for flere vanlige hensiktsbaserte oppgaver. For eksempel kan du bruke sin bla () funksjon for å åpne en nettadresse i enhetens standard nettleser-app. På samme måte kan du bruke e-post () funksjon for å åpne standard e-postprogram og komponere en e-post.

// Åpne nettleser bla gjennom ("https://tutsplus.com") // Åpne standard e-post app e-post ("[email protected]", "Hei", "Dette er en test e-post")

5. Bruke SQLite databaser

Selv om alle Android-apper kan opprette og bruke SQLite-databaser uten ekstra avhengigheter, velger mange utviklere tredjepartsdatabaser som Realm. Hvorfor? Vel, kanskje det er fordi Android's SQLite API er ekstremt verbose, lavt nivå, og krever en god forståelse av SQL. Heldigvis har Anko SQLite Helper-funksjoner for å løse alle disse problemene.

La oss si at vi har en enkel SQLite-database opprettet ved hjelp av følgende kode:

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

Med Anko kan du nå legge til et bord i databasen ovenfor ved å bruke createTable () funksjon, som forventer navnet på tabellen sammen med en eller flere tuples som spesifiserer navnene og datatyper på kolonnene. Følgende prøvekode lager en tabell som heter PERSON å ha fire kolonner, hvorav den ene tjener som en primærnøkkel:

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

Dessuten, å sette inn rader i bordet, du trenger ikke lenger å stole på ContentValues ​​() klasse. Du kan ringe direkte sett inn() funksjon i databasen, spesifiser navnet på tabellen du vil legge til rad til, og send deretter kolonnverdiene til den i form av tuples.

// Legg til en rad myDB.insert ("PERSON", "NAME" til "Bob Martin", "AGE" til 25, "NET_WORTH" til 2500.50, "ID" til 100) // Legg til en annen rad myDB.insert PERSON "," NAME "til" Jane Flores "," AGE "til 32," NET_WORTH "til 21500.80," ID "til 101)

Til slutt, for å spørre databasen, kan du bruke å velge() funksjon, eventuelt etterfulgt av en kjede av intuitivt navngitte funksjoner som whereSimple (), rekkefølge etter(), og gruppe av(). For eksempel, for å oppgi navn og alder for alle personer i tabellen ovenfor, hvis nettoverdi er større enn 10000, Du kan bruke følgende kode:

myDB.select ("PERSON", "NAME", "AGE") .whereSimple ("NET_WORTH>?", "10000.0") .exec // Mer kode her

Resultatet av ovennevnte spørring vil, som du forventer, være a markør gjenstand. Konvertere den til en Liste inneholdende faktiske kolonneverdier av alle radene er litt mer komplisert fordi det innebærer å skape et objekt som implementerer RowParser grensesnitt og overfører det til parseList () funksjon.

De RowParser grensesnittet har bare en metode, den parseRow () metode, innenfor hvilken du får tilgang til kolonneverdiene av en rad. Hvordan du bruker verdiene, er selvfølgelig opp til deg. For nå, la oss bare sammenkoble dem og skrive ut dem. Følgende kode viser hvordan du gjør det:

parseliste (objekt: RowParseroverstyre morsom parseRow (kolonner: Array): String // Kombiner verdiene til første og andre kolonner, // som tilfeldigvis er NAME og AGE tilbake "$ kolonner [0] ($ kolonner [1] år gammel)"). for hver println (den) // skriv ut de sammenkalte verdiene // Resultatet er: // Jane Flores (32 år gammel)

Merk at du ikke alltid trenger å opprette en RowParser objekt manuelt. Hvis resultatene av spørringen inneholder bare én kolonne, kan du gratis bruke en av Ankos mange innebygde parsere. 

Navnene på de innebygde parserne er basert på datatypene i kolonnene. For eksempel, hvis datatypen er TEKST, du kan bruke en StringParser. Eller om datatypen er INTEGER, du kan bruke en IntParser. Følgende kode viser deg hvordan du bruker en StringParser å bare oppgi navnene på alle personer i vår database:

myDB.select ("PERSON", "NAME") .exec parseList (StringParser) .forEach println (det) // Resultatet er: // Bob Martin // Jane Flores

Konklusjon

I denne opplæringen lærte du hvordan du bruker Ankos DSL- og hjelperfunksjoner for å forenkle Android applikasjonsutvikling. Du så også hvordan Anko forenkler SQLite-relaterte operasjoner. Jeg håper du nå innser hvor godt gjennomtenkt og nyttig biblioteket er.

Etter min mening, hvis du allerede er kompetent i Kotlin, er det virkelig ingen grunn til at du ikke bør bruke Anko for å forbedre effektiviteten og utviklingsopplevelsen ytterligere. For å lære mer om det, vennligst referer til sin offisielle wiki.

Og mens du er her, sjekk ut noen av våre andre innlegg om Kotlin og Android app utvikling!