之旅(D9)"/>
Kotlin学习之旅(D9)
Kotlin学习之旅第九天
今天的主题是 - -Android Extensions
前言
Kotlin学习之旅(D1)-学习计划&基本语法
Kotlin学习之旅(D2)-基本语法
Kotlin学习之旅(D3)-类与继承
Kotlin学习之旅(D4)-函数与Lambda表达式
Kotlin学习之旅(D5)-高级语法
Kotlin学习之旅(D6)-Kotlin Idioms part 1
Kotlin学习之旅(D7)-Kotlin Idioms part 2
Kotlin学习之旅(D8)-From Java to Kotlin
Android Extensions 是什么
Kotlin Android Extensions 是 Kotlin 团队开发的一个插件,目的是让我们在开发过程中可以减少代码的编写量。主要的功能就是:视图绑定
在Java中,我们经常要写的一句代码就是 findViewById()
,但是在一个Layou有许多View存在的情况下,重复写这句代码不仅工作量大,而且可读性差,因此各路大神发挥智慧,推出了许多的第三方库,其中最著名的就是ButterKnife
了 ,但是使用ButterKnife有个不好的地方,就是需要定义成员变量,代码量和原生的方式差不多。
现在 Kotlin Android Extensions 能够提供与这些开源库功能相同的体验,并且不需要添加任何额外代码。
Android Extensions 怎么用
1.在Moudle中的build.gradle文件添加插件配置
apply plugin: 'kotlin-android-extensions'
2. 在View中引入资源文件
import kotlinx.android.synthetic.main.activity_main.*
3.访问id
import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 1btn_login.setOnClickListener {Toast.makeText(this@MainActivity,"Android Extensions test",Toast.LENGTH_SHORT).show()}}
}
- 通过btn_login.setXXX 的方式来访问view,并且调用view相关方法,不需要写
findViewById()
import格式
import
格式是这样的:kotlinx.android.synthetic.main.布局名称.*
。需要注意的是include
进来的布局,也是需要通过import
导入相应布局,这样才能正常使用。
ViewHolder 使用Extensions
刚开始的时候Extensions是不支持在ViewHolder中使用视图绑定的,因此还是需要些findViewById,但是从Kotlin 1.1.4起,Extensions加入了增强功能,由于这项功能还未正式发布,因此需要开启实验标志
####1.开启experimental
在Module的build.gradle文件中设置:
androidExtensions {experimental = true
}
2.编写ViewHolder
import android.support.v7.widget.RecyclerView
import android.view.View
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.activity_main.*class ViewHolder constructor(override val containerView: View?): RecyclerView.ViewHolder(containerView),LayoutContainer { // 1fun setContent(str: String) {helloTv.text = str // 2}
}
- 实现LayoutContainer
- 使用helloTv.text
3. 什么是LayoutContainer
在Activity,Fragment,View中我们知道import对应的layout就可以了,但是像ViewHolder这些特殊的,我们就需要通过实现LayoutContainer接口,接口返回一个containerView,按照字面意思理解就是内容视图,这个containerView就包含了ViewHolder里面的所有子View,因此可以直接使用view.setxxx / view.property 的写法
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 的大小。
- 用方法调用替换每一个属性调用。
例如:
class MyActivity: Activity()
fun MyActivity.a() { this.textView.setText(“”)
}
总结
Kotlin Android Extensions 的主要功能其实就是视图绑定,但是这一个功能也可以减少许多重复代码的编写,因此有机会还是把这个插件用上吧~
Day 9 - Learn Kotlin Trip, Completed.
更多推荐
Kotlin学习之旅(D9)
发布评论