Suche…


Einführung

Kotlin verfügt über eine integrierte View-Injection für Android, mit der manuelle Bindungen übersprungen werden können oder Rahmen wie ButterKnife erforderlich sind. Einige Vorteile sind eine schönere Syntax, eine bessere statische Typisierung und somit weniger fehleranfällig.

Aufbau

Beginnen Sie mit einem richtig konfigurierten Gradle-Projekt .

In Ihrem Projekt-local (nicht auf oberster Ebene) build.gradle Erweiterungen anhängen unter Ihrem Kotlin Plugin, auf der obersten Ebene Einrückungsebene Plugin Erklärung.

buildscript {
    ...
}

apply plugin: "com.android.application"
...
apply plugin: "kotlin-android"
apply plugin: "kotlin-android-extensions"
...

Ansichten verwenden

Angenommen, wir haben eine Aktivität mit einem Beispiellayout namens activity_main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/my_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="My button"/>
</LinearLayout>

Wir können Kotlin-Erweiterungen verwenden, um die Schaltfläche ohne weitere Bindung aufzurufen.

import kotlinx.android.synthetic.main.activity_main.my_button

class MainActivity: Activity() {
    override fun onCreate(savedInstanceBundle: Bundle?) {
        super.onCreate(savedInstanceBundle)
        setContentView(R.layout.activity_main)
        // my_button is already casted to a proper type of "Button"
        // instead of being a "View"
        my_button.setText("Kotlin rocks!")
    }
}

Sie können auch alle im Layout angezeigten IDs mit einer * -Notation importieren

// my_button can be used the same way as before
import kotlinx.android.synthetic.main.activity_main.*

Synthetische Ansichten können nicht außerhalb von Aktivitäten / Fragmenten / Ansichten mit diesem aufgeblasenen Layout verwendet werden:

import kotlinx.android.synthetic.main.activity_main.my_button

class NotAView {
    init {
        // This sample won't compile!
        my_button.setText("Kotlin rocks!")
    }
}

Produktaromen

Android-Erweiterungen funktionieren auch mit mehreren Android-Produktvarianten. Zum Beispiel, wenn wir in build.gradle haben:

android {
    productFlavors {
        paid {
            ...
        }
        free {
            ...
        }
    }
}

Und zum Beispiel hat nur der freie Geschmack einen Buy-Button:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/buy_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Buy full version"/>
</LinearLayout>

Wir können uns speziell an den Geschmack binden:

import kotlinx.android.synthetic.free.main_activity.buy_button

Ein schmerzhafter Zuhörer, wenn Sie Kenntnis erhalten, wenn die Ansicht jetzt vollständig gezeichnet ist, ist dies mit Kotlins Erweiterung so einfach und fantastisch

mView.afterMeasured {
  // inside this block the view is completely drawn
  // you can get view's height/width, it.height / it.width
}

Unter der Haube

inline fun View.afterMeasured(crossinline f: View.() -> Unit) {
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
        if (measuredHeight > 0 && measuredWidth > 0) {
            viewTreeObserver.removeOnGlobalLayoutListener(this)
            f()
        }
    }
})
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow