Android App-Entwicklung mit Anko vereinfachen

Anko wurde von JetBrains, der Organisation hinter Kotlin, entworfen. Sie ist eine Open-Source-Bibliothek, die die Erstellung von Android-Apps radikal verändern kann. Es nutzt die Syntax von Kotlin und bietet eine große Auswahl an Hilfsfunktionen, mit denen Sie die Ausführlichkeit Ihres Codes reduzieren und gleichzeitig die Leistung verbessern können.

Anko dient als DSL, kurz für domänenspezifische Sprache, zum Erstellen von Android-Layouts. Mit anderen Worten, es kann als typsichere, dynamische und wiederverwendbare Alternative zu Layout-XML-Dateien fungieren, die, wie Sie vielleicht bereits wissen, bei großen Apps unhandlich werden.

In diesem Tutorial werde ich Ihnen beim Einstieg in Anko helfen, indem ich Ihnen zeige, wie Sie einige der beliebtesten Funktionen nutzen können.

1. Projekteinrichtung

Um die Kernfunktionen von Anko in Ihrem Android Studio-Projekt nutzen zu können, müssen Sie lediglich Folgendes hinzufügen Implementierung Abhängigkeit in der App Modul build.gradle Datei:

Implementierung 'org.jetbrains.anko: anko: 0.10.1'

Wenn Sie möchten, dass Anko mit Widgets aus Android-Unterstützungsbibliotheken arbeitet, benötigen Sie jedoch die folgenden zusätzlichen Abhängigkeiten:

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

2. Layouts erstellen

Das Anko DSL verfügt über Hilfsfunktionen für fast jedes Widget, das vom Android SDK und den Android-Unterstützungsbibliotheken angeboten wird. Mit ihnen können Sie Ihre Layouts programmgesteuert erstellen. Die Namen der Funktionen stimmen mit den Namen der Widgets überein, beginnen jedoch mit einem Kleinbuchstaben. Zum Beispiel, um eine Textvorschau Widget, verwenden Sie Ankos Textvorschau() Funktion. Ähnlich ein a erstellen FloatingActionButton Widget können Sie das verwenden floatingActionButton () Funktion.

Innerhalb der Funktionen haben Sie Zugriff auf alle Eigenschaften und Ereignis-Listener der zugehörigen Widgets. Beispielsweise können Sie die Textgröße von a ändern Textvorschau Widget durch Aktualisieren des Werts von Textgröße Eigentum innerhalb der Textvorschau() Funktion. In ähnlicher Weise können Sie einen Ereignis-Listener mit Klick auf klicken onClick Methode.

Zum besseren Verständnis der Verwendung von DSL finden Sie hier ein Beispiel-Layout für eine Browser-App mit einer Text bearbeiten Widget und ein WebView Widget in einem platziert LinearLayout Widget, dessen Ausrichtung ist VERTIKALE:

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 = webViewClient =)

Code, der in Anko DSL geschrieben wird, ist sehr gut lesbar und intuitiv, aber es ist gewöhnungsbedürftig, insbesondere wenn Sie bereits ein erfahrener Android-Entwickler sind. Sie müssen Ihren Widgets keine Bezeichnungen mehr zuweisen - oder die findViewById () Diese Referenzmethode kann verwendet werden, da die DSL-basierten Layouts von Anko im Gegensatz zu XML-basierten Layouts die Geschäftslogik Ihrer App kapseln können. Zum Beispiel können Sie das sehen Text bearbeiten Das oben definierte Widget verfügt über eine OnEditorAction Ereignis-Listener, der direkt die loadUrl () Methode der WebView Widget, um die vom Benutzer eingegebene URL zu laden.

Außerdem müssen Sie nicht anrufen setContentView () Methode nicht mehr, weil Anko es automatisch in Ihrem anruft Aktivität Klasse onCreate () Methode.

Das DSL enthält mehrere Verknüpfungen, mit denen Sie Ihre Layouts übersichtlicher gestalten können. Sie können beispielsweise Strings direkt an seine Funktionen übergeben, um Widgets Beschriftungen zuzuweisen. Häufig können Sie auch die explizite Einstellung von Layoutparametern wie Breiten und Höhen vermeiden, da sie automatisch behandelt werden. Der folgende Beispielcode zeigt, wie Sie ein Layout mit zwei Elementen erstellen Textvorschau Widgets auf eine prägnante Weise:

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

Zum Vergleich: Das obige Layout würde aussehen, wenn es konventionell erstellt würde:

    

Schließlich ist es erwähnenswert, dass mit Anko DSL erstellte Layouts in der Regel schneller geladen werden als reguläre Layouts, da kein XML-Parsing erforderlich ist.

3. Dialoge erstellen

Wenn du denkst mit der AlertDialog.Builder Klasse zum Erstellen von Dialogen ist eine Menge Arbeit, Sie sind definitiv nicht alleine. So erstellen Sie normalerweise ein einfaches Dialogfeld, in dem ein Titel, eine Nachricht und die Schaltfläche "OK" angezeigt werden:

AlertDialog.Builder (this @ MyActivity) .setTitle ("My Dialog") .setMessage ("Dies ist eine Testnachricht") .setPositiveButton ("OK", null) .create () .show ()

Bei Anko erfordert das Erstellen des obigen Dialogs jedoch lediglich einen Aufruf an warnen() Funktion, die den Titel und die Nachricht des Dialogs als Argument akzeptiert.

alert ("Dies ist eine Testnachricht", "Mein Dialog") yesButton  .show ()

Beachten Sie, dass Sie keinen Kontext an den übergeben müssen warnen() Funktion. Der Kontext wird automatisch eingeblendet.

Anko verfügt über ähnliche intuitiv benannte Funktionen, mit denen Sie auch Toasts und Snackbars schnell erstellen können. Der folgende Code zeigt Ihnen, wie Sie kurze und lange Toasts erstellen können:

Toast ("Dies ist ein kurzer Toast") longToast ("Und das ist ein langer Toast")

4. Absichten schaffen

Wann immer Sie eine neue Aktivität in Ihrer App starten müssen, müssen Sie eine Absicht erstellen. Wenn Sie Daten an die Aktivität senden möchten, müssen Sie sie zusätzlich als einen oder mehrere Extras in die Absicht aufnehmen. 

Mit Ankos startActivity () Funktion können Sie normalerweise beide Aufgaben in nur einer Codezeile ausführen. Der folgende Code zeigt beispielsweise, wie Sie eine Aktivität mit dem Namen starten Meine Aktivität und zwei Extras, eine Zeichenfolge mit dem Namen "PERSON" und eine Ganzzahl mit dem Namen "AGE", übergeben:

startActivity("PERSON" bis "Bob", "ALTER" bis 25)

Anko verfügt auch über Hilfsfunktionen für mehrere allgemeine absichtsbasierte Aufgaben. Zum Beispiel können Sie es verwenden Durchsuche() Funktion zum Öffnen einer URL in der Standardbrowser-App des Geräts. Ebenso können Sie das verwenden Email() Funktion zum Öffnen der Standard-E-Mail-App und zum Erstellen einer E-Mail.

// Browser öffnen Durchsuchen ("https://tutsplus.com") // Standard-E-Mail-App-E-Mail öffnen ("[email protected]", "Hallo", "Dies ist eine Test-E-Mail")

5. Verwenden von SQLite-Datenbanken

Obwohl jede Android-App SQLite-Datenbanken ohne zusätzliche Abhängigkeiten erstellen und verwenden kann, entscheiden sich viele Entwickler für Datenbanken von Drittanbietern wie Realm. Warum? Vielleicht liegt es daran, dass die SQLite-API von Android extrem ausführlich und auf niedrigem Niveau ist und ein gutes Verständnis von SQL erfordert. Glücklicherweise verfügt Anko über SQLite-Hilfsfunktionen, um all diese Probleme anzugehen.

Nehmen wir an, wir haben eine einfache SQLite-Datenbank, die mit dem folgenden Code erstellt wurde:

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

Mit Anko können Sie der obigen Datenbank jetzt einfach eine Tabelle hinzufügen, indem Sie die Tabelle erstellen() Funktion, die den Namen der Tabelle zusammen mit einem oder mehreren Tupeln erwartet, die die Namen und Datentypen ihrer Spalten angeben. Der folgende Beispielcode erstellt eine Tabelle mit dem Namen PERSON mit vier Spalten, von denen eine als Primärschlüssel dient:

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

Um Zeilen in die Tabelle einzufügen, müssen Sie sich nicht mehr auf die ContentValues ​​() Klasse. Sie können die direkt anrufen einfügen() Geben Sie den Namen der Tabelle an, der Sie die Zeile hinzufügen möchten, und übergeben Sie die Spaltenwerte in Form von Tupeln.

// Eine Zeile myDB.insert hinzufügen ("PERSON", "NAME" bis "Bob Martin", "ALTER" bis 25, "NET_WORTH" bis 2500.50, "ID" bis 100) // Eine weitere Zeile hinzufügen myDB.insert (" PERSON "," NAME "bis" Jane Flores "," ALTER "bis 32," NET_WORTH "bis 21500.80," ID "bis 101)

Um die Datenbank abzufragen, können Sie auch die wählen() Funktion, optional gefolgt von einer Kette von intuitiv benannten Funktionen wie z whereSimple (), Sortieren nach(), und gruppiere nach(). B. die Namen und das Alter aller Personen in der obigen Tabelle auf, deren Nettowert größer als ist 10000, Sie können den folgenden Code verwenden:

myDB.select ("PERSON", "NAME", "ALTER") .whereSimple ("NET_WORTH>?", "10000.0"). exec // hier mehr Code

Das Ergebnis der obigen Abfrage ist, wie Sie vielleicht erwarten, a Mauszeiger Objekt. Umwandlung in eine Liste Das Enthalten der tatsächlichen Spaltenwerte aller Zeilen ist etwas komplizierter, da ein Objekt erstellt werden muss, das die RowParser Schnittstelle und Weitergabe an die parseList () Funktion.

Das RowParser Schnittstelle hat nur eine Methode, die parseRow () Methode, in der Sie Zugriff auf die Spaltenwerte einer Zeile haben. Wie Sie die Werte verwenden, liegt natürlich bei Ihnen. Lassen Sie uns diese erst einmal zusammenfügen und ausdrucken. Der folgende Code zeigt, wie das geht:

parseList (Objekt: RowParser)überschreibe fun parseRow (Spalten: Array)): String // Verketten Sie die Werte der ersten und zweiten Spalte, // die zufällig NAME sind und AGE "$ column [0] ($ column [1] Jahre alt)") zurückgeben. forEach println (it) // Die verketteten Werte drucken // Das Ergebnis ist: // Jane Flores (32 Jahre)

Beachten Sie, dass Sie nicht immer ein erstellen müssen RowParser Objekt manuell. Wenn die Ergebnisse Ihrer Abfrage nur eine Spalte enthalten, können Sie einen der vielen integrierten Parser von Anko verwenden. 

Die Namen der integrierten Parser basieren auf den Datentypen der Spalten. Zum Beispiel, wenn der Datentyp ist TEXT, Sie können eine verwenden StringParser. Oder wenn der Datentyp ist GANZE ZAHL, Sie können eine verwenden IntParser. Der folgende Code zeigt die Verwendung von a StringParser Um einfach die Namen aller Personen in unserer Datenbank aufzulisten:

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

Fazit

In diesem Lernprogramm haben Sie gelernt, wie Sie Ankos DSL- und Hilfsfunktionen verwenden, um die Entwicklung von Android-Anwendungen zu vereinfachen. Sie haben auch gesehen, wie Anko SQLite-bezogene Vorgänge vereinfacht. Ich hoffe, Sie erkennen jetzt, wie durchdacht und nützlich die Bibliothek ist.

Meines Erachtens gibt es keinen Grund, Anko nicht zu nutzen, wenn Sie bereits über Kotlin verfügen und Ihre Effizienz und Entwicklungserfahrung weiter verbessern. Um mehr darüber zu erfahren, konsultieren Sie das offizielle Wiki.

Und während Sie hier sind, lesen Sie einige unserer anderen Beiträge über die Entwicklung von Kotlin und Android-Apps!