Anko är designad av JetBrains, organisationen bakom Kotlin, ett bibliotek med öppen källkod som kan radikalt ändra hur du skapar Android-appar. Det utnyttjar Kotls syntax för att erbjuda en stor samling hjälparfunktioner som hjälper dig att minska koden hos din kod samtidigt som du förbättrar dess prestanda.
Anko fördubblas som en DSL, kort för domänspecifikt språk, för att skapa Android-layouter. Med andra ord kan det fungera som ett typ säkert, dynamiskt och mer återanvändbart alternativ till layout XML-filer, som, som du kanske redan vet, tenderar att bli obehagliga för stora appar.
I den här handledningen hjälper jag dig att komma igång med Anko genom att visa dig hur du använder några av de mest populära funktionerna.
För att kunna använda kärnfunktionerna i Anko i ditt Android Studio-projekt är allt du behöver göra att lägga till följande genomförande
beroendet i app
modulens build.gradle fil:
genomförande "org.jetbrains.anko: anko: 0.10.1 '
Om du vill att Anko ska arbeta med widgets från Android: s supportbibliotek behöver du dock följande ytterligare beroenden:
implementering "org.jetbrains.anko: anko-appcompat-v7: 0.10.1" implementation "org.jetbrains.anko: anko-design: 0.10.1" implementation "org.jetbrains.anko: anko-recyclerview-v7: 0.10. 1 "implementation" org.jetbrains.anko: anko-cardview-v7: 0.10.1 '
Anko DSL har hjälparfunktioner för nästan varje widget som erbjuds av Android SDK och Android-supportbiblioteken. Med hjälp av dem kan du skapa dina layouter programmatiskt. Namnen på funktionerna matchar namnen på widgetsna, men de börjar med en liten bokstav. Till exempel, för att skapa en Textview
widget, du använder Ankos Textview ()
fungera. På samma sätt, för att skapa en FloatingActionButton
widget, kan du använda floatingActionButton ()
fungera.
Inuti funktionerna har du tillgång till alla egenskaper och händelsehörare av de tillhörande widgetsna. Du kan till exempel ändra textstorleken för a Textview
widget genom att uppdatera värdet av textstorlek
egendom inne i Textview ()
fungera. På samma sätt kan du lägga till en klickhändelse som lyssnar på den med hjälp av onClick
metod.
För att hjälpa dig att bättre förstå hur du använder DSL, här är en provlayout för en webbläsarapp som innehåller en Redigera text
widget och a WebView
widget placerad inuti a Linear
widget vars orientering är VERTIKAL
:
linearLayout orientering = 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 ()
Kod skrivet i Anko DSL är mycket läsbar och intuitiv, men det tar lite att vänja sig, särskilt om du redan är en erfaren Android-utvecklare. Du behöver inte längre tilldela identifierare till dina widgets-eller använda findViewById ()
Metod för att referera till dem - eftersom Unkos DSL-baserade layouter, till skillnad från XML-baserade layouter, kan inkapsla din apps affärslogik. Du kan till exempel se att Redigera text
widgeten definierad ovan har en OnEditorAction
händelse lyssnare som direkt samtalar loadUrl ()
metod för WebView
widget för att ladda URL-adressen som användaren skrev in.
Dessutom behöver du inte ringa setContentView ()
metod eftersom Anko kallar det automatiskt inuti din Aktivitet
klassens onCreate ()
metod.
DSL innehåller flera genvägar du kan använda för att göra dina layouter mer koncisa. Till exempel kan du direkt överföra strängar till sina funktioner för att tilldela etiketter till widgets. Ofta kan du också undvika att uttryckligen ställa in layoutparametrar som bredder och höjder eftersom det hanterar dem automatiskt. Följande provkod visar hur du skapar en layout som innehåller två Textview
widgets på ett mycket kortfattat sätt:
verticalLayout textView ("One") textView ("Two")
För jämförelse, här är vad ovanstående layout skulle se ut om den skapades konventionellt:
Slutligen är det värt att nämna att layouter skapade med Anko DSL tenderar att ladda snabbare än vanliga layouter eftersom det inte behövs XML-parsing.
Om du funderar på att använda AlertDialog.Builder
klass för att skapa dialoger är mycket arbete, du är definitivt inte ensam. Det här är till exempel hur du normalt skapar en enkel dialogruta som visar en titel, ett meddelande och en "OK" -knapp:
AlertDialog.Builder (this @ MyActivity) .setTitle ("My Dialog") .setMessage ("Detta är ett testmeddelande") .setPositiveButton ("OK", null) .create () .show ()
Med Anko skapar dock dialogrutan ovan bara ett samtal till varna()
funktion, som accepterar dialogens titel och meddelande som dess argument.
varning ("Detta är ett testmeddelande", "Min dialog") yesButton .show ()
Observera att du inte behöver överföra ett sammanhang till varna()
fungera. Den infogar sammanhanget automatiskt.
Anko har liknande intuitivt namngivna funktioner som hjälper dig att snabbt skapa toast och snackbars också. Följande kod visar hur du skapar både korta och långa varaktiga toasts:
toast ("This is a short toast") longToast ("Och det här är en lång toast")
När du behöver starta en ny aktivitet i din app måste du skapa en avsikt. Dessutom, om du vill skicka data till aktiviteten måste du inkludera den i avsikt som en eller flera extrafunktioner.
Med Ankos startActivity ()
funktion, kan du vanligtvis utföra båda uppgifterna i bara en rad kod. Till exempel visar följande kod hur du startar en aktivitet som heter MyActivity
och skicka två extras, en sträng extra med namnet "PERSON" och ett helt tal som heter "Ålder", till det:
startActivity("PERSON" till "Bob", "Ålder" till 25)
Anko har också hjälparfunktioner för flera gemensamma uppdragsbaserade uppgifter. Till exempel kan du använda dess bläddra()
funktionen för att öppna en URL i enhetens standardwebbläsare. På samma sätt kan du använda e-post()
funktionen för att öppna standard e-postapp och skapa ett e-postmeddelande.
// Öppna webbläsaren bläddra ("https://tutsplus.com") // Öppna standard e-post app e-post ("[email protected]", "Hej", "Detta är en test-e-post")
Även om alla Android-appar kan skapa och använda SQLite-databaser utan ytterligare beroenden väljer många utvecklare databaser från tredje part som Realm. Varför? Jo kanske det beror på att Android SQLite API är extremt verbos, låg nivå och kräver en god förståelse för SQL. Lyckligtvis har Anko SQLite-hjälparfunktioner för att hantera alla dessa problem.
Låt oss säga att vi har en enkel SQLite-databas som skapats med följande kod:
val myDB = openOrCreateDatabase ("test.db", Context.MODE_PRIVATE, null)
Med Anko kan du nu lägga till en tabell i ovanstående databas genom att använda skapa bord()
funktion, vilket förväntar sig bordets namn tillsammans med en eller flera tomter som anger namnen och datatyperna i dess kolumner. Följande provkod skapar en tabell som heter PERSON
med fyra kolumner, varav en är en primär nyckel:
myDB.createTable ("PERSON", sant "NAME" till TEXT, "AGE" till INTEGER, "NET_WORTH" till REAL, "ID" till INTEGER + PRIMARY_KEY)
Dessutom lägger du rader i tabellen, du behöver inte längre vara beroende av ContentValues ()
klass. Du kan ringa direkt Föra in()
funktion i databasen, ange namnet på tabellen som du vill lägga till raden i och sedan skicka kolumnvärdena till den i form av tuples.
// Lägg till en rad myDB.insert ("PERSON", "NAME" till "Bob Martin", "AGE" till 25, "NET_WORTH" till 2500.50, "ID" till 100) // Lägg till en annan rad myDB.insert PERSON "," NAME "till" Jane Flores "," AGE "till 32," NET_WORTH "till 21500.80," ID "till 101)
Slutligen, för att fråga databasen, kan du använda Välj()
funktion, eventuellt följd av en kedja av intuitivt benämnda funktioner såsom whereSimple ()
, sortera efter()
, och Grupp av()
. Till exempel, för att lista namn och ålder för alla personer i tabellen ovan, vars nettoförmögenhet är större än 10 tusen
, du kan använda följande kod:
myDB.select ("PERSON", "NAME", "AGE") .whereSimple ("NET_WORTH>?", "10000.0") .exec // Mer kod här
Resultatet av ovanstående fråga kommer, som du kan förvänta dig, a markör
objekt. Konvertera det till en Lista
innehållande faktiska kolumnvärden för alla rader är lite mer komplicerat eftersom det innebär att skapa ett objekt som implementerar RowParser
gränssnitt och passera det till parseList ()
fungera.
De RowParser
gränssnittet har bara en metod, den parseRow ()
metod, inom vilken du får tillgång till kolumnvärdena för en rad. Hur du använder värdena är naturligtvis upp till dig. För nu, låt oss bara sammanfoga dem och skriva ut dem. Följande kod visar hur du gör det:
parseList (objekt: RowParseråsidosätta roliga parseRow (kolumner: Array ): String // Kombinera värdena för den första och andra kolumnen, // som råkar vara NAME och AGE returnera "$ kolumner [0] ($ kolumner [1] år gamla)"). forEach println (it) // skriv ut de sammanlänkade värdena // Resultatet är: // Jane Flores (32 år gammal)
Observera att du inte alltid behöver skapa en RowParser
objekt manuellt Om resultaten av din fråga innehåller bara en kolumn kan du använda en av Ankos många inbyggda parsers.
Namnen på de inbyggda parsrarna är baserade på datatyperna i kolumnerna. Till exempel, om datatypen är TEXT
, du kan använda en StringParser
. Eller om datatypen är HELTAL
, du kan använda en IntParser
. Följande kod visar hur du använder en StringParser
att helt enkelt lista namnen på alla personer i vår databas:
myDB.select ("PERSON", "NAME") .exec parseList (StringParser) .forEach println (it) // Resultatet är: // Bob Martin // Jane Flores
I denna handledning lärde du dig hur du använder Ankos DSL- och hjälparfunktioner för att förenkla Android-applikationsutveckling. Du såg också hur Anko förenklar SQLite-relaterade operationer. Jag hoppas att du nu inser hur väl genomtänkt och användbart biblioteket är.
Enligt min åsikt, om du redan är kompetent i Kotlin, finns det verkligen ingen anledning till varför du inte ska använda Anko för att ytterligare förbättra din effektivitet och utvecklingserfarenhet. För att lära dig mer om det, hänvisa till sin officiella wiki.
Och medan du är här, kolla in några av våra andra inlägg om Kotlin och Android app utveckling!