Kotlin
Kotlin Android-extensies
Zoeken…
Invoering
Kotlin heeft een ingebouwde weergave-injectie voor Android, waardoor handmatig binden of het gebruik van frameworks zoals ButterKnife wordt overgeslagen. Enkele voordelen zijn een mooiere syntaxis, beter statisch typen en dus minder foutgevoelig.
Configuratie
Begin met een correct geconfigureerd gradle-project .
build.gradle
in uw projectlokaal (niet op het hoogste niveau) build.gradle
extensie- build.gradle
toe onder uw Kotlin-plug-in, op inspringniveau op het hoogste niveau.
buildscript {
...
}
apply plugin: "com.android.application"
...
apply plugin: "kotlin-android"
apply plugin: "kotlin-android-extensions"
...
Weergaven gebruiken
Ervan uitgaande dat we een activiteit hebben met een voorbeeldlay-out genaamd 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>
We kunnen Kotlin-extensies gebruiken om de knop aan te roepen zonder extra binding zoals:
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!")
}
}
U kunt ook alle ID's importeren die in de lay-out verschijnen met een *
-notatie
// my_button can be used the same way as before
import kotlinx.android.synthetic.main.activity_main.*
Synthetische weergaven kunnen niet worden gebruikt buiten activiteiten / fragmenten / weergaven met die lay-out opgeblazen:
import kotlinx.android.synthetic.main.activity_main.my_button
class NotAView {
init {
// This sample won't compile!
my_button.setText("Kotlin rocks!")
}
}
Product smaken
Android-extensies werken ook met meerdere Android-productflavours. Als we bijvoorbeeld smaken hebben in build.gradle
:
android {
productFlavors {
paid {
...
}
free {
...
}
}
}
En bijvoorbeeld, alleen de gratis smaak heeft een koopknop:
<?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>
We kunnen specifiek aan de smaak binden:
import kotlinx.android.synthetic.free.main_activity.buy_button
Pijnlijke luisteraar voor het krijgen van kennisgeving, wanneer het beeld nu volledig is getekend, is zo eenvoudig en geweldig met de extensie van Kotlin
mView.afterMeasured {
// inside this block the view is completely drawn
// you can get view's height/width, it.height / it.width
}
Onder de motorkap
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()
}
}
})
}