Kotlin
Kotlin Android-tillägg
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()
}
}
})
}