Kotlin for Android
参考:
- http://kotlinlang.org/docs/tutorials/kotlin-android.html
- http://kotlinlang.org/docs/tutorials/android-plugin.html
-
https://github.com/Kotlin/anko/wiki
4.https://medium.com/@v.souhrada/introduction-to-anko-for-android-part-1-6178d536cbe6
1. 环境搭建
1.1 项目根目录 gradle文件新增
buildscript {
ext.kotlin_version = '1.2.30'
ext.anko_version = '0.8.2' // anko
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:3.0.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
}
2. 对应的模块 gradle文件新增:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
经过上面2个步骤,环境基本上就OK 了;
2. Kotlin Android Extensions
Kotlin 为Android开发提供一些工具插件,用来替换findViewById等操作,提高Android开发体验;
Android Extensions
是Kotlin 为Android Studio 提供插件的一部分,不需要额外导入其他插件了;开启方法:
项目的gradle文件引入:
apply plugin: 'kotlin-android-extensions'
目前有一些功能还是实验性阶段,我们可以开启它,在gradle文件中配置:
androidExtensions {
experimental = true
}
2.1 ViewBind
import kotlinx.android.synthetic.main.activity_main.* // 导包
supportActionBar?.title = "Mae Demo Kotlin" // 使用
不用担心这样使用,查找到的 View,会将其缓存起来的; 怎么缓存的呢,默认使用HashMap
;
如果你不想让他缓存,在相应类上,加入注解:
@ContainerOptions(cache = CacheImplementation.NO_CACHE)
2.2 【实验性阶段】
对Parcelable的支持
@Parcelize
data class SampleItem<T>(var id: Int?, var pid: Int = 0,
var clazz: Class<out T>?, var title: String?,
var desc: String?) : Parcelable {
constructor() : this(null, 0, null, null, null)
}
如果想添加自定义逻辑,可通过伴生对象来做;
private companion object : Parceler<SampleItem<*>> {
override fun create(parcel: Parcel): SampleItem<*> {
}
override fun SampleItem<*>.write(parcel: Parcel, flags: Int) {
}
}
3. anko
anko 是一个类似工具包的组件,用来方便Android开发,它由几部分组成:
- common :
- layout
- sqlite
- coroutines
3.1 anko-common:
简化intent、Dialog、Logging、Resource操作等;
引入依赖
implementation "org.jetbrains.anko:anko-common:$anko_version"
感觉没啥东西,大家看看wiki即可;
我们看看一个类的源码:
https://github.com/Kotlin/anko/blob/master/anko/library/static/commons/src/ContextUtils.kt
3.2 anko-layout
使用dsl来代替xml布局;
引入依赖
// Anko Layouts
compile "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also available
compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
// Coroutine listeners for Anko Layouts
compile "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"
compile "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"
简写RecylerView Adapter
inner class Adapter(val items: List<SampleItem<Activity>>,
val listener: ((SampleItem<Activity>) -> Unit)? = null) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun getItemCount(): Int = items.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view = with(parent.context) {
verticalLayout {
padding = dip(8)
textView {
id = android.R.id.text1
textSize = 16f
typeface = Typeface.DEFAULT_BOLD
topPadding = dip(4)
}.lparams()
textView {
id = android.R.id.text2
textSize = 14f
topPadding = dip(2)
bottomPadding = dip(4)
}.lparams()
}
}
return object : RecyclerView.ViewHolder(view){} // 内部类实现
}
}
dsl构造控件片段
button {
text = "Bounce"
onClick { // click 事件
val anim = getScaleAnim()
anim.interpolator = BounceInterpolator()
view.startAnimation(anim)
}
}.lparams(wrapContent, wrapContent) {
topMargin = dip(2)
}