Kotlin都出来了好几年,火起来的时候也还没去学,今年想着学习下更好
对于Android开发来说,代码量精简了很多,extends被 : 代替,implement被 , 代替
class MainActivity : AppCompatActivity(), View.OnClickListener {
}
其他的一些变化和基本语法,在android项目中边学边看便用
现在讲讲Kotlin在android开发中OnClickListener的表现
重写的onClick中,以往java中的switch被when代替
override fun onClick(v: View?) {
when (v) {
}
}
case R.id.xx 被具体控件采用 xx -> 具体事件 代替
override fun onClick(v: View?) {
when (v) {
btn -> toast("点击了按钮")
}
}
其中btn的来源
//var 为变量,val常量,相当于final
private var btn: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn = findViewById(R.id.main_btn)
main_btn.setOnClickListener(this)
}
toast采用的是Android增强库:Anko(添加依赖在末文)
toast包含两个方法:默认的短时长:toast()以及长时长:longToast()
对于toast函数,它在Anko库中的定义是:
//短时间显示
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
//长时间显示
fun Context.longToast(message: Int) = Toast.makeText(this, message, Toast.LENGTH_LONG).show()
在java的点击事件中,一个控件的点击监听中,可以处理多个事件,那么在Kotlin中该如何处理多个事件呢?
直接换行写肯定是不行的,在Kotlin中,控件的点击监听多个事件采用的就是:控件 -> {事件1;事件2}
override fun onClick(v: View?) {
when (v) {
//一个点击监听多个事件,采用 {xx;xx}形式
//或者{xx
// xx}
//回车键相当于';'
btn -> {toast("点击了按钮");title?.text = origin.toInt().toString()}
// btn -> {toast("点击了按钮")
// title?.text = origin.toInt().toString()}
}
}
这个格式很熟悉吧
最后提出一个疑问:
既然控件的点击监听采用的是 控件-> 事件,对于同一个控件监听多个事件为什么不能采用如下方法:
override fun onClick(v: View?) {
when (v) {
//一个点击监听多个事件,采用 {xx;xx}形式
btn -> toast("点击了按钮")
btn -> title?.text = origin.toInt().toString()
}
}
这样的写法只会对第一个事件生效
求大佬解答
最后的运行结果图
Anko依赖添加:
在项目的build.gradle的buildscript{添加Anko}
buildscript {
ext.kotlin_version = '1.3.41'
//Anko版本
ext.anko_version = "0.9"
repositories {
google()
jcenter()
}
在app的build.gradle的dependencies{添加Anko}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
//anko库的编译配置
implementation "org.jetbrains.anko:anko-common:$anko_version"
}
感谢各位的查看
在编程的道路越走越远