原文链接:

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的:

// Using R.layout.activity_main from the main source setimport 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插件:

apply plugin: 'kotlin-android-extensions'

引入生成的属性

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

import kotlinx.android.synthetic.main..*

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

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

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

  

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

activity.hello.setText("Hi!")

Android版本

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

android {    productFlavors {        free {            versionName "1.0-free"        }    }}

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

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

内部原理

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

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

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

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

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

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

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

更多相关文章

  1. Android(安卓)自定义View (一)
  2. Plugin-X Integration Guide for Android
  3. Android常用三方框架
  4. Android之属性动画Animator
  5. android studio 3.0.1依赖butterknife报错问题解决办法以及andro
  6. android 使用Webview时候清楚缓存各种方式无效后
  7. android布局全屏显示,状态栏和导航栏透明设置
  8. android中的R中属性获取相关
  9. Android(安卓)圆角图片CircleImageView

随机推荐

  1. android tabHost布局 大全
  2. android AysncTask简介
  3. Android 打开这个 apk文件
  4. Android 无法连接dl-ssl.google.com addo
  5. android 画图画板清空
  6. Android 从源码分析BLE连接错误分析
  7. android EditText禁止输入的几种做法
  8. android emulator: ERROR: unknown virtu
  9. java.io.FileNotFoundException: /mnt/sd
  10. android 4.0.3编译错误