Kotlin Android Extensions (译文)

原文链接:

http://kotlinlang.org/docs/tutorials/android-plugin.html

Kotlin Android Extensions

本教程介绍如何使用Kotlin Android Extensions来改进对Android开发的支持。

在本教程中,我们将介绍使用Kotlin Android Extensions插件所需的步骤,增强Android的开发体验。

背景

每个Android开发人员都很清楚findViewById()方法。 毫无疑问,这是一个难以阅读与维护,并且存在潜在bug的丑陋代码。 虽然有几个可用的库可以为此问题提供解决方案,但依赖于运行时的库,最让你头疼的是它们需要为每个View添加注释字段。

Kotlin Android Extensions插件允许我们获得与使用这些库后相同的体验,而无需添加任何额外的代码或消耗额外的运行时间。

实质上,下面这段代码时OK的:

1
2
3
4
5
6
7
8
9
10
11
// Using R.layout.activity_main from the main source set
import kotlinx.android.synthetic.main.activity_main.*
class MyActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView.setText("Hello, world!")
// Instead of findView(R.id.textView) as TextView
}
}

textView是Activity的扩展属性,并且它的类型和acitvity_main.xml文件中申明的一致。


使用Kotlin Android Extensions

配置依赖

在这个教程中,我们将使用Gradle作为我们的操作环境,在 IntelliJ IDEA 环境或者Maven下大同小异。更多关于Kotlin的Gradle配置,请查阅Using Gradle.

Android Extensions是Kotlin IDEA插件的一部分,你不需要再安装其他的插件。
你需要做的就是使用下面的方式在你的项目及build.gradle中启用Android Extensions Gradle插件:

1
apply plugin: 'kotlin-android-extensions'

引入生成的属性

使用下面的方式,你可以很方便的一键引入特定布局的所有控件的属性:

1
import kotlinx.android.synthetic.main.<layout>.*

所以呢,如果我们的布局是activity_main.xml,我们将引入
kotlinx.android.synthetic.main.activity_main.*

如果我们想使用声称的View的属性(在适配器类中很好用),我们需要引入
kotlinx.android.synthetic.main.activity_main.view.*

一旦我们按照上面的步骤做,我们就可以调用相应的扩展,就是那些在XML文件中的视图之后命名的属性。 例如,对于这个视图:

1
2
3
4
5
6
<TextView
android:id="@+id/hello"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, MyActivity"
/>

然后就会存在一个名为hello 的属性

1
activity.hello.setText("Hi!")

Android版本

Android Extensions 插件支持Android 多渠道版本,假如在你的build.gradle中有一个名为free的版本

1
2
3
4
5
6
7
android {
productFlavors {
free {
versionName "1.0-free"
}
}
}

然后你就可以通过如下方式导入针对free/res/layout/activity_free.xml的所有生成的属性。

1
import kotlinx.android.synthetic.free.activity_free.*

内部原理

Kotlin Android Extensions 是一个Kotlin编译器插件。它执行下面两个操作:

  1. 为每一个Kotlin Activity添加一个隐藏的缓存方法和一个域。这个方法相当之小,基本不会增加APK 的大小。
  2. 用方法调用替换每一个属性调用。

那么,这是如何工作的呢?
当调用一个生成的属性时,如果接收方时存在于模块源代码中的Kotlin Activity或者Fragment,缓存的方法将会被调用。例如,提供

1
2
3
4
class MyActivity: Activity()
fun MyActivity.a() {
this.textView.setText(“”)
}

一个缓存方法会自动在MyActivity中生成,所有我们可以使用缓存机制。
然而在下面这个例子中

1
2
3
fun Activity.b() {
this.textView.setText(“”)
}

我们不知道这个方法是否仅在我们的源代码的Activity或普通Java Activity中被调用。 因此,即使上一个示例中的MyActivity实例是接收器,我们也不使用缓存。

文章目录
  1. 1. 原文链接:
  • Kotlin Android Extensions
  • 背景
  • 使用Kotlin Android Extensions
    1. 配置依赖
    2. 引入生成的属性
  • Android版本
  • 内部原理
  • |