📜  Kotlin Android 扩展

📅  最后修改于: 2022-05-13 01:54:58.631000             🧑  作者: Mango

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

合成视图不能在该布局膨胀的活动/片段/视图之外使用:

科特林

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



  

我们可以专门绑定风味:

被注意到的痛苦听众,当视图现在完全绘制时,使用 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()
     }
   }
 })
}