Vereenvoudig de ontwikkeling van Android-apps met Anko

Ontworpen door JetBrains, de organisatie achter Kotlin, Anko is een open-source bibliotheek die de manier waarop je Android-apps maakt radicaal kan veranderen. Het maakt gebruik van de syntaxis van Kotlin om een ​​grote verzameling helperfuncties aan te bieden die u helpen de breedsprakigheid van uw code te verminderen en tegelijkertijd de prestaties te verbeteren.

Anko fungeert ook als een DSL, een afkorting voor domeinspecifieke taal, voor het maken van Android-lay-outs. Met andere woorden, het kan fungeren als een typeveilig, dynamisch en meer herbruikbaar alternatief voor XML-lay-outbestanden, die, zoals u wellicht al weet, onhandelbaar worden voor grote apps.

In deze zelfstudie help ik u aan de slag te gaan met Anko door u te laten zien hoe u enkele van de populairste functies kunt gebruiken.

1. Projectinstelling

Om de kernfuncties van Anko in uw Android Studio-project te kunnen gebruiken, hoeft u alleen het volgende toe te voegen implementatie afhankelijkheid in de app module build.gradle het dossier:

implementatie 'org.jetbrains.anko: anko: 0.10.1'

Als u wilt dat Anko werkt met widgets uit de ondersteuningsbibliotheken van Android, heeft u echter de volgende aanvullende afhankelijkheden nodig:

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

2. Lay-outs maken

De Anko DSL heeft helperfuncties voor bijna elke widget die wordt aangeboden door de Android SDK en de Android-ondersteuningsbibliotheken. Met behulp van deze kunt u uw lay-outs programmatisch maken. De namen van de functies komen overeen met de namen van de widgets, maar ze beginnen met een kleine letter. Bijvoorbeeld om een ​​te maken Tekstweergave widget, je gebruikt Anko's tekstweergave() functie. Evenzo, om een ​​te maken FloatingActionButton widget, kunt u de floatingActionButton () functie.

Binnen de functies hebt u toegang tot alle eigenschappen en gebeurtenislisteners van de bijbehorende widgets. U kunt bijvoorbeeld de tekstgrootte van een wijzigen Tekstweergave widget door de waarde van de update bij te werken lettergrootte eigendom binnen de tekstweergave() functie. Op dezelfde manier kunt u een gebeurtenisklant aan de klik toevoegen met behulp van de bij klikken methode.

Voor een beter begrip van het gebruik van de DSL, hier is een voorbeeldlay-out voor een browser-app, die een Tekst bewerken widget en a WebView widget geplaatst in een LinearLayout widget waarvan de richting is VERTICAAL:

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 ()

Code geschreven in de Anko DSL is zeer leesbaar en intuïtief, maar het is even wennen, vooral als je al een ervaren Android-ontwikkelaar bent. U hoeft niet langer ID's aan uw widgets toe te wijzen of de findViewById () methode om ernaar te verwijzen-omdat in tegenstelling tot op XML gebaseerde lay-outs, Anko's op DSL gebaseerde lay-outs de bedrijfslogica van uw app kunnen inkapselen. Je kunt bijvoorbeeld zien dat het Tekst bewerken widget hierboven gedefinieerd heeft een OnEditorAction gebeurtenis luisteraar die direct het loadUrl () methode van de WebView widget om de URL te laden die de gebruiker heeft ingetypt.

Bovendien hoeft u de. Niet te bellen setContentView () methode niet meer omdat Anko het automatisch in je Activiteit klasse onCreate () methode.

De DSL bevat verschillende sneltoetsen die u kunt gebruiken om uw lay-outs beknopter te maken. U kunt bijvoorbeeld strings rechtstreeks doorgeven aan de bijbehorende functies om labels toe te wijzen aan widgets. Vaak kunt u ook vermijden expliciet lay-outparameters in te stellen, zoals breedten en hoogten, omdat deze ze automatisch afhandelen. In de volgende voorbeeldcode ziet u hoe u een lay-out met twee kunt maken Tekstweergave widgets op een zeer beknopte manier:

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

Ter vergelijking: hier ziet de bovenstaande lay-out eruit als deze op de volgende manier is gemaakt:

    

Ten slotte is het vermeldenswaard dat lay-outs gemaakt met de Anko DSL sneller laden dan reguliere lay-outs, omdat er geen XML-parsing vereist is.

3. Dialoogvensters maken

Als u denkt dat u de AlertDialog.Builder klasse om dialogen te maken is heel veel werk, je bent beslist niet de enige. Hier ziet u bijvoorbeeld hoe u normaal gesproken een eenvoudig dialoogvenster maakt met een titel, een bericht en een knop 'OK':

AlertDialog.Builder (this @ MyActivity) .setTitle ("Mijn dialoog") .setMessage ("Dit is een testbericht") .setPositiveButton ("OK", null) .create () .show ()

Met Anko brengt het maken van het bovenstaande dialoogvenster eenvoudigweg een oproep naar de alert () functie, die de titel en het bericht van het dialoogvenster als zijn argumenten accepteert.

alert ("Dit is een testbericht", "Mijn dialoogvenster") yesButton  .show ()

Merk op dat u geen context hoeft door te geven aan de alert () functie. Het leidt de context automatisch af.

Anko heeft vergelijkbare, intuïtief benoemde functies waarmee je snel ook toast en snackbars kunt maken. De volgende code laat u zien hoe u zowel korte als lange duur toasts maakt:

toast ("Dit is een korte toast") longToast ("En dit is een lange toast")

4. Creëren van intenties

Wanneer u een nieuwe activiteit in uw app moet starten, moet u een intentie maken. Als u bovendien gegevens naar de activiteit wilt verzenden, moet u deze in de opzet opnemen als een of meer extra's. 

Met Anko's startActivity () functie, kunt u meestal beide taken uitvoeren in slechts één regel code. Met de volgende code ziet u bijvoorbeeld hoe u een activiteit met de naam start Mijn activiteit en geef twee extra's door, een string extra genaamd "PERSON" en een integer extra genaamd "AGE", eraan:

startActivity("PERSOON" tot "Bob", "AGE" tot 25)

Anko heeft ook helperfuncties voor verschillende, op gemeenschappelijke intenties gebaseerde taken. U kunt bijvoorbeeld de bladeren () functie om een ​​URL te openen in de standaard browser-app van het apparaat. Op dezelfde manier kunt u de e-mail () functie om de standaard e-mailapp te openen en een e-mail samen te stellen.

// Browsermogelijkheid openen ("https://tutsplus.com") // Standaard e-mailapp van app openen ("[email protected]", "Hallo", "Dit is een test-e-mail")

5. SQLite-databases gebruiken

Hoewel elke Android-app SQLite-databases kan maken en gebruiken zonder bijkomende afhankelijkheden, kiezen veel ontwikkelaars databases van derden, zoals Realm. Waarom? Nou, misschien is het omdat Android SQLite API is extreem breedsprakig, low-level, en vereist een goed begrip van SQL. Gelukkig heeft Anko SQLite-helperfuncties om al die problemen aan te pakken.

Laten we zeggen dat we een eenvoudige SQLite-database hebben gemaakt met behulp van de volgende code:

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

Met Anko kunt u nu eenvoudig een tabel aan de bovenstaande database toevoegen met behulp van de createTable () functie, die de naam van de tabel verwacht samen met een extra of tuples die de namen en gegevenstypen van de kolommen specificeert. De volgende voorbeeldcode maakt een tabel met de naam PERSOON met vier kolommen, waarvan er één als primaire sleutel dient:

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

Wat meer is, om rijen in de tabel in te voegen, hoeft u niet langer afhankelijk te zijn van de ContentValues ​​() klasse. U kunt rechtstreeks bellen met de voegen () functie in de database, geef de naam op van de tabel waaraan u de rij wilt toevoegen en geef de kolomwaarden daarop door in de vorm van tuples.

// Voeg een rij toe myDB.insert ("PERSON", "NAME" tot "Bob Martin", "AGE" tot 25, "NET_WORTH" tot 2500.50, "ID" tot 100) // Voeg nog een rij toe myDB.insert (" PERSOON "," NAAM "tot" Jane Flores "," LEEFTIJD "tot 32," NET_WORTH "tot 21500.80," ID "tot 101)

Als laatste, om de database te doorzoeken, kunt u de select () functie, optioneel gevolgd door een keten van intuïtief benoemde functies zoals whereSimple (), orderBy (), en GroupBy (). Om bijvoorbeeld de namen en leeftijden te vermelden van alle personen in de bovenstaande tabel waarvan de nettowaarde groter is dan 10000, je kunt de volgende code gebruiken:

myDB.select ("PERSON", "NAME", "AGE") .whereSimple ("NET_WORTH>?", "10000.0"). exec // Meer code hier

Het resultaat van de bovenstaande zoekopdracht is, zoals je zou verwachten, een Cursor voorwerp. Het omzetten in een Lijst het bevatten van werkelijke kolomwaarden van alle rijen is iets ingewikkelder omdat het gaat om het creëren van een object dat de RowParser interface en doorgeven aan de parseList () functie.

De RowParser interface heeft slechts één methode, de parseRow () methode, waarin u toegang hebt tot de kolomwaarden van een rij. Hoe u de waarden gebruikt, is natuurlijk aan u. Laten we ze voorlopig gewoon samenvoegen en afdrukken. De volgende code laat zien hoe je dit doet:

parseList (object: RowParseroverride fun parseRow (columns: Array): String // De waarden van de eerste en tweede kolom samenvoegen, // die toevallig NAME en AGE zijn, retourneren "$ columns [0] ($ columns [1] jaar oud)"). voor elk println (it) // print de aaneengeschakelde waarden // Resultaat is: // Jane Flores (32 jaar oud)

Merk op dat je niet altijd een RowParser object handmatig. Als de resultaten van uw zoekopdracht slechts één kolom bevatten, kunt u een van de vele ingebouwde parsers van Anko gebruiken. 

De namen van de ingebouwde parsers zijn gebaseerd op de gegevenstypen van de kolommen. Als het gegevenstype bijvoorbeeld is TEKST, je kunt een gebruiken StringParser. Of als het gegevenstype is GEHEEL GETAL, je kunt een gebruiken IntParser. De volgende code laat zien hoe u a moet gebruiken StringParser om eenvoudig de namen van alle personen in onze database op te sommen:

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

Conclusie

In deze zelfstudie hebt u geleerd hoe u de DSL- en helperfuncties van Anko kunt gebruiken om de ontwikkeling van Android-apps te vereenvoudigen. Je zag ook hoe Anko SQLite-gerelateerde bewerkingen vereenvoudigt. Ik hoop dat je je nu realiseert hoe goed doordacht en nuttig de bibliotheek is.

Als u al competent bent in Kotlin, is er naar mijn mening echt geen reden waarom u Anko niet zou moeten gebruiken om uw efficiëntie en ontwikkelingservaring verder te verbeteren. Raadpleeg de officiële wiki voor meer informatie.

En terwijl je hier bent, bekijk enkele van onze andere berichten over Kotlin en Android app-ontwikkeling!