Sök…


Introduktion

Kotlin har en inbyggd vyinjektion för Android, vilket gör att man kan hoppa över manuell bindning eller behov av ramar som ButterKnife. Några av fördelarna är en trevligare syntax, bättre statisk typ och därmed mindre felaktig.

Konfiguration

Börja med ett korrekt konfigurerat gradprojekt .

I din projekt-lokala (inte toppnivå) build.gradle lägg till tilläggstillägg för plugin-tillägg under ditt Kotlin-plugin, på toppnivå indragningsnivå.

buildscript {
    ...
}

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

Använda vyer

Förutsatt att vi har en aktivitet med en exempellayout som heter 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>

Vi kan använda Kotlin-tillägg för att ringa knappen utan någon extra bindning så:

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!")
    }
}

Du kan också importera alla id som visas i layout med en * notation

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

Syntetiska vyer kan inte användas utanför aktiviteter / fragment / vyer med den layouten uppblåst:

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

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

Produkt smaker

Android-tillägg fungerar också med flera Android-produktsmak. Om vi till exempel har smaker i build.gradle så:

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

Och till exempel bara den fria smaken har en köpknapp:

<?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>

Vi kan binda specifikt till smaken:

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

Smärtsam lyssnare för att få uppmärksamhet när vyn är helt ritad nu är så enkel och fantastisk med Kotlins förlängning

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

Under huven

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow