原文链接:

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 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插件:

apply plugin: 'kotlin-android-extensions'

引入生成的属性

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

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

所以呢,如果我们的布局是activity_main.xml,我们将引入

kotlinx.android.synthetic.main.activity_main.*

如果我们想使用声称的View的属性(在适配器类中很好用),我们需要引入

kotlinx.android.synthetic.main.activity_main.view.*

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

  <TextView
            android:id="@+id/hello"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Hello World, MyActivity"
            />

然后就会存在一个名为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实例是接收器,我们也不使用缓存。

Kotlin Android Extensions (译文)的更多相关文章

  1. Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04) -- 更新版

    作者:Antonio Leiva 时间:Aug 16, 2017 原文链接:https://antonioleiva.com/kotlin-android-extensions/ 在 Kotlin1. ...

  2. Kotlin Android学习入门

    1.基本语法 https://github.com/mcxiaoke/kotlin-notes/blob/master/kotlin-tutorial-basic.md 2.推荐两篇Kotlin An ...

  3. Kotlin, Android的Swift

    Kotlin, Android的Swift 苹果已经用Swift代替Objective-C,一种古老的语言,来进行iOS的开发了.明显Android开发也有这个趋势. 虽然现在已经可以选择Scala或 ...

  4. Kotlin Android项目静态检查工具的使用

    Kotlin Android项目静态检查工具的使用 Kotlin Android项目可用的静态检查工具: Android官方的Lint, 第三方的ktlint和detekt. 静态检查工具 静态检查工 ...

  5. Kotlin & Android & Swift & Flutter & React Native

    Kotlin & Android https://www.runoob.com/kotlin/kotlin-tutorial.html Swift 5 & iOS 12 https:/ ...

  6. Kotlin Android Studio 环境搭建

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源. Kotlin 可以编译成Java字节码,也可以编 ...

  7. android.mk-编译文件学习(转载)

    工作了那么久,都是使用大神们写的脚本机械的编译,对于android.mk根本没去了解过.今天趁着这个机会,在网上搜索了下.虽然依然不是很名白,留做记录,以后真用到了,再深入研究 转载自 http:// ...

  8. 用Kotlin开发Android应用(IV):定制视图和Android扩展

    原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...

  9. 即刻开始使用Kotlin开发Android的12个原因(KAD 30)

    作者:Antonio Leiva 时间:Jul, 11, 2017 原文链接:https://antonioleiva.com/reasons-kotlin-android/ 这组文章已到最后了,它们 ...

随机推荐

  1. js 添加css属性

    $(".active").css('border','1px solid #ddd')curLi.css('border','2px solid red')curLi.css('b ...

  2. Sql case when 小例

    SELECT I.uname, C.consume, O.name,O.dis_count,O.memberType, D.name,D.dis_count,D.up,D.down, CASE WHE ...

  3. JS中的正则应用

    如果还未掌握正则基础知识可先看另一篇:正则笔记-忘记就来看 创建方法: 直接量语法:/pattern/attributes 创建 RegExp 对象的语法:new RegExp(pattern, at ...

  4. Python单元测试框架——unittest

    测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过se ...

  5. Docker 使用指南 —— 基本操作

    Docker 是一个能够把开发应用程序自动部署到容器的开源引擎.它由Docker公司的团队编写,基于Apache 2.0开源协议授权.它提供了一个简单.轻量的建模方式,使开发生命周期更高效快速,鼓励了 ...

  6. 【Head First Servlets and JSP】笔记24:include指令与include动作 & param动作 & foward动作

    include指令与include动作 1.样例代码 <%@ page contentType="text/html;charset=UTF-8" language=&quo ...

  7. H5新特性---新应用

    1.持久化本地存储 可以不通过第三方插件实现数据的本地存储 2.WebSocket 页面之间可以双向通信 3.服务器推送事件(SSE) 从Web服务器将消息推送给浏览器(在手机中常见) 例如: < ...

  8. 阻塞方法与InterruptedException

    什么是阻塞方法?为什么会抛出InterruptedException? 一般方法的完成只取决于它所要做的事情,以及是否有足够多可用的计算资源(CPU 周期和内存). 而阻塞方法的完成还取决于一些外部的 ...

  9. 回溯算法 DFS深度优先搜索 (递归与非递归实现)

    回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

  10. CentOS6、7优化脚本完美版

    #!/bin/bash SysVer=`cat /etc/redhat-release | awk -F'release' '{print $2}' | awk -F'[ .]+' '{print $ ...