前言
试水Kotlin有一段时间了,纸上得来终觉浅,绝知此事要躬行。所以在继续翻译官方文档之前,先瞅瞅怎么用它进行Android开发。
开发环境
我就比较偷懒了,3.0版本已经集成了Kotlin语言的编译环境。这样省去好多麻烦。
新建项目
同建立Java版项目一样,只不过新版AndroidStudio已经支持添加Kotlin语言支持
,勾上支持,那么everything is OK!!!
Android工程结构保持不变,甚至可以同时使用Java、Kotlin两种语言同时开发项目。
新建Activity
选择源文件语言Kotlin,
最终生成这样的kt文件,注意看logo!
使用注解
这里我用到了之前开发的一个工具类(请参见:Android自定义权限与动态申请权限
)
在Java中,我们这样使用:
//申请一个权限
@RequestPermission(Manifest.permission.INTERNET)
//申请多个权限,注意花括号
@RequestPermission({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.INTERNET})
Kotlin中有两个版本:
//同Java一样
@RequestPermission (Manifest.permission.WRITE_EXTERNAL_STORAGE)
//缺少花括号
@RequestPermission (Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE)
使用参数名称赋值:
//value是String[],也接收一个权限
@RequestPermission(value = Manifest.permission.CALL_PHONE)
//接收多个权限转String[]
@RequestPermission(value = *arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE))
使用ButterKnife
Java版使用ButterKnife,针对Kotlin JakeWharton大神们特意研发了kotterknife
(github地址)。
集成时候比ButterKnife
简单很多,但是功能也少些,在app的build.gradle
中添加:
repositories {
……
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
dependencies {
……
compile 'com.jakewharton:kotterknife:0.1.0-SNAPSHOT'
}
Java版使用,使用前,需要调用BindView.bind(this)
方法
@BindView(R.id.activity_main_tv)
TextView tvHello;
Kotlin版使用,不支持使用onclick注解。
val tvHello: TextView by bindView<TextView>(R.id.activity_main_tv)
使用继承和接口
@RequestPermission(value = Manifest.permission.CALL_PHONE)
//自己封装了BaseActivity类,并实现OnClickListener接口
class MainActivity : BaseActivity(), View.OnClickListener {
//这么看,比使用findViewById 貌似更麻烦些。
val tvHello: TextView by bindView<TextView>(R.id.activity_main_tv)
//获取布局,直接对函数进行赋值。
override fun getContentLayout() = R.layout.activity_main
override fun initData() {
//可以同Java一样,调用setText方法,但是Kotlin支持直接使用控件的属性进行赋值。
tvHello.text = "Hello World";
}
override fun initAction() {
super.initAction()
//添加点击事件
tvHello.setOnClickListener(this)
}
override fun onClick(v: View?) {
//使用when替换switch,而且直接使用控件的id属性。
when (v!!.id) {
R.id.activity_main_tv -> Toast.makeText(this, "hello Android", Toast.LENGTH_LONG).show()
else -> Toast.makeText(this, "null", Toast.LENGTH_LONG).show()
}
}
/**
*申请权限后,拒绝的回调
*/
override fun onPermissionRefuse(permission: String?) {
super.onPermissionRefuse(permission)
}
}