替代findViewById()
虽然有几个可用的库可以为此问题提供解决方案,但是不光需要依赖额外的库,也需要为每个库注释字段View。
Kotlin Android Extensions
插件允许我们获得与这些库中的一些相同的体验,而无需添加任何额外的代码或运送任何额外的运行时。
实质上,这将允许以下代码:
// 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
的属性,它与activity_main.xml
中view的类型相同
使用Kotlin Android扩展
配置依赖关系
此扩展程序是Kotlin IDEA插件的一部分。不需要安装其他插件。
需要的是在Module: app
的build.gradle
文件中启用Android Extensions Gradle插件:
apply plugin: 'kotlin-android-extensions'
一旦配置好,我们可以调用相应的扩展,例如,对于这个视图:
<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!")
activity中效果:
[图片上传失败...(image-7e8028-1510728474371)]
如果布局文件名是activity_main.xml
,将默认直接导入
kotlinx.android.synthetic.main.activity_main.*。
实现原理
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(“”)
}
我们不知道这个方法是否仅在Activities或普通Java Activities中被调用。因此,即使上一个示例中的MyActivity实例是接收器,我们也不使用缓存。
本文已经同步到我的个人博客:传送门
网友评论