Kotlin Android 扩展
如果您已经开发了一段时间的 Android 应用程序,那么您可能已经厌倦了在日常生活中使用 findViewById 来恢复视图。或者,也许您放弃并开始使用著名的 Butterknife 库。如果这是你的情况,那么你会喜欢 Kotlin Android 扩展。 Kotlin 有一个内置的 Android 视图注入,允许跳过手动绑定或需要诸如 ButterKnife 之类的框架。一些优点是更好的语法,更好的静态类型,因此更不容易出错。在您的项目本地(非顶级)build.gradle 中,在您的 Kotlin 插件下方的顶级缩进级别上附加扩展插件声明。
buildscript {
...
}
apply plugin: "com.android.application"
...
apply plugin: "kotlin-android"
apply plugin: "kotlin-android-extensions"
...
使用视图
假设我们有一个带有名为 activity_main.xml 的示例布局的活动:
XML
Kotlin
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!")
}
}
Kotlin
import kotlinx.android.synthetic.main.activity_main.my_button
class NotAView {
init {
// This sample won't compile!
my_button.setText("Kotlin rocks!")
}
}
XML
Kotlin
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()
}
}
})
}
我们可以使用 Kotlin 扩展来调用按钮,而无需任何额外的绑定,如下所示:
科特林
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!")
}
}
您还可以使用 * 符号导入布局中出现的所有 id
// my_button can be used the same way as before
import kotlinx.android.synthetic.main.activity_main.*
合成视图不能在该布局膨胀的活动/片段/视图之外使用:
科特林
import kotlinx.android.synthetic.main.activity_main.my_button
class NotAView {
init {
// This sample won't compile!
my_button.setText("Kotlin rocks!")
}
}
产品风味
Android 扩展也适用于多种 Android 产品风格。例如,如果我们在 build.gradle 中有这样的风味:
android {
productFlavors {
paid {
...
}
free {
...
}
}
}
例如,只有免费口味有购买按钮:
XML
我们可以专门绑定风味:
import kotlinx.android.synthetic.free.main_activity.buy_button
被注意到的痛苦听众,当视图现在完全绘制时,使用 Kotlin 的扩展是如此简单和令人敬畏
mView.afterMeasured {
// inside this block the view is completely drawn
// you can get view's height/width, it.height / it.width
}
引擎盖下
科特林
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()
}
}
})
}