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的:
// 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编译器插件。它执行下面两个操作:
- 为每一个Kotlin Activity添加一个隐藏的缓存方法和一个域。这个方法相当之小,基本不会增加APK 的大小。
- 用方法调用替换每一个属性调用。
那么,这是如何工作的呢?
当调用一个生成的属性时,如果接收方时存在于模块源代码中的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 (译文)的更多相关文章
- Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04) -- 更新版
作者:Antonio Leiva 时间:Aug 16, 2017 原文链接:https://antonioleiva.com/kotlin-android-extensions/ 在 Kotlin1. ...
- Kotlin Android学习入门
1.基本语法 https://github.com/mcxiaoke/kotlin-notes/blob/master/kotlin-tutorial-basic.md 2.推荐两篇Kotlin An ...
- Kotlin, Android的Swift
Kotlin, Android的Swift 苹果已经用Swift代替Objective-C,一种古老的语言,来进行iOS的开发了.明显Android开发也有这个趋势. 虽然现在已经可以选择Scala或 ...
- Kotlin Android项目静态检查工具的使用
Kotlin Android项目静态检查工具的使用 Kotlin Android项目可用的静态检查工具: Android官方的Lint, 第三方的ktlint和detekt. 静态检查工具 静态检查工 ...
- Kotlin & Android & Swift & Flutter & React Native
Kotlin & Android https://www.runoob.com/kotlin/kotlin-tutorial.html Swift 5 & iOS 12 https:/ ...
- Kotlin Android Studio 环境搭建
Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源. Kotlin 可以编译成Java字节码,也可以编 ...
- android.mk-编译文件学习(转载)
工作了那么久,都是使用大神们写的脚本机械的编译,对于android.mk根本没去了解过.今天趁着这个机会,在网上搜索了下.虽然依然不是很名白,留做记录,以后真用到了,再深入研究 转载自 http:// ...
- 用Kotlin开发Android应用(IV):定制视图和Android扩展
原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...
- 即刻开始使用Kotlin开发Android的12个原因(KAD 30)
作者:Antonio Leiva 时间:Jul, 11, 2017 原文链接:https://antonioleiva.com/reasons-kotlin-android/ 这组文章已到最后了,它们 ...
随机推荐
- Tomcat 源码分析(转)
本文转自:http://blog.csdn.net/haitao111313/article/category/1179996 Tomcat源码分析(一)--服务启动 1. Tomcat主要有两个组件 ...
- jQuery图片放大预览
在线演示 本地下载
- Google揭露SHA-1碰撞,加速数据重删字节对比
原创 架构师技术联盟 近期,Google和道荷兰阿姆斯特研究者宣布攻破了世界上第一例公开的SHA-1哈希碰撞实例,业界一片哗然.当两组不同的数据(文件.一段数据)计算出相同的Hash值时,即视为二者 ...
- xshell 常用命令
一.grep 命令 (1)命令格式 grep [选项] pattern [file] (2)常用参数 参数 描述 -c 计算找到 '搜寻字符串'(即 pattern) 的次数 -i 忽略大小写的不同, ...
- 用来在category里加属性的宏
众所周知,一般的情况下我们是没办法在category里加属性的. 如果想加,需要用到Associated. @interface NSObject (XYFlyweightTransmit) @pro ...
- Spring 模块
- 混合开发的大趋势之一React Native之Image (脑动理解)
文章是宝宝自己写的,你可以转走,标明哪来的就行王亟亟的大牛之路 国庆这些天要么旅游要么WOW,感觉整个人都废了.. 直接从黄种人晒成了非洲大酋长..然而还是无橙,这礼拜要做7天,昨天把单元测试的东西整 ...
- Oracle 配置tnsnames.ora
之所以要配置这个文件,是因为里面有配置数据库 服务器的地址. 目录: E:\app\PC-Gang\product\11.2.0\dbhome_1\NETWORK\ADMIN
- JNI_Z_05_方法的操作(没有String类型的参数)
1.步骤: (1).获取 jclass (2).获取 method的id (3).调用 method ZC: 貌似 JNI里面 操作 类的方法,完全是 无视 访问权限的... 然而 static的方法 ...
- RxJava+RxAndroid+MVP入坑实践(基础篇)
转载请注明出处:http://www.blog.csdn.net/zhyxuexijava/article/details/51597230.com 前段时间看了MVP架构和RxJava,最近也在重构 ...