btn_test.setOnClickListener { btn_test.text = “您点了一下下” }
有没有很熟悉的感觉呢?而长按事件处理和点击事件差不太多,只要在长按代码末尾加上true的返回,就可以了,代码如下:
btn_test.setOnLongClickListener { btn_test.text=“您长按了一小下下”;true }
上面的两种按钮事件代码其实是简化最彻底的表达形式,因为点击事件和长按时间本身存在输入参数,它们的入参是发生了点击和长按动作的视图对象,所以完整的事件处理代码应当保留视图对象这个输入参数。只不过由于多数情况用不到视图对象,因此在Kotlin中把冗余的视图入参给省略了,但是为了弄清楚按钮事件的来龙去脉,还是有必要观察一下它的本来面貌,接下来依次介绍按钮事件的三种Kotlin编码方式:匿名函数、内部类、接口实现。
1. 匿名函数方式
//点击事件第一种:匿名函数方式
btn_test.setOnClickListener { v ->
//Kotlin对变量进行类型转换的关键字as
toast(“您点击了控件:${(v as Button).text}”)
}
从上面的代码可以得出,点击事件的函数代码被符号“ ->” 分成两部分:前一部分的“v” 表示发生了点击动作的视图入参,其类型为View,后一部分则为处理点击事件的具体函数体代码。此时的函数体代码中还有两个值得注意的地方:
(1)因为视图View是基本的视图类型,并不存在文本属性,所以需要把这个视图对象的变量类型转换为按钮Button,然后才能得到按钮对象的文本,Kotlin中的类型转换通过关键字as实现的,具体的转换格式形如“待转换的变量名称 as 转换后的类型名称”。
(2)由于待显示的字符串需要拼接按钮文本,因此需要通过字符串模板表达式"${***} "将按钮文本置于该字符串。
2. 内部类方式
对于包含较多行代码的事件处理,往往给它定义一个内部类,这样该事件的处理代码被完全封装在内部类之中,能够有效增强代码的可读性。下面给按钮的点击和长按事件分别定义内部类,代码如下:
package com.llw.kotlinstart
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import com.llw.kotlinstart.custom_class.*
import kotlinx.android.synthetic.main.activity_main.*
import org.jetbrains.anko.longToast
import org.jetbrains.anko.toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//点击事件第二种:内部类方式
btn_test.setOnClickListener(MyClickListener())//点击
btn_test.setOnLongClickListener(MyLongClickListener())//长按
}
//点击事件第二种:内部类方式,还记得inner吗,内部类就是在class前面加上inner
private inner class MyClickListener:View.OnClickListener{
override fun onClick(v: View?) {
toast(“您点击了控件:${(v as Button).text}”)
}
}
private inner class MyLongClickListener:View.OnLongClickListener{
override fun onLongClick(v: View): Boolean {
longToast(“您长按了控件:${(v as Button).text}”)
return true
}
}
}
3. 接口实现方式
内部类方式固然使事件代码更加灵活,可如果每个事件都定义新的内部类,要是某个页面上有多个控件都需要监听对应的事件处理,那页面上的代码就会很多,为了解决这个问题,第三种方式➖接口实现方式边应运而生,该方式让页面的Activity类实现事件监听器的接口,并重写监听器的接口方式,使得那些接口方法就像是Activity类的成员方法一样,并且可以毫无障碍地访问该Activity类的所有成员属性和成员方法。下面是示例代码:
package com.llw.kotlinstart
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import com.llw.kotlinstart.custom_class.*
import kotlinx.android.synthetic.main.activity_main.*
import org.jetbrains.anko.longToast
import org.jetbrains.anko.toast
class MainActivity : AppCompatActivity(), View.OnClickListener, View.OnLongClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//点击事件第三种:Activity实现接口
btn_test.setOnClickListener(this)
btn_test.setOnLongClickListener(this)
}
//点击事件第三种:Activity实现接口
override fun onClick(v: View) {
if (v.id == R.id.btn_test) {
toast(“您点击了控件:${(v as Button).text}”)
}
}
override fun onLongClick(v: View): Boolean {
if (v.id == R.id.btn_test) {
longToast(“您长按了控件:${(v as Button).text}”)
}
return true
}
}
复选框用于检查有没有选中的控件,只有两种情况,选中和未选中。也就是true和false,在学习复选框的用法之前,先了解一下复合按钮CompoundButton的概念,在Android体系中,CompoundButton是抽象的复合按钮,因为是抽象类,所以不能直接使用,而我们实际开发中用的是它的几个派生类,如复选框CheckBox、单选按钮RadioButton单选按钮、Switch开关按钮,这些派生类均可使用CompoundButton的属性和方法。
在Java中,复合按钮CompoundButton的勾选状态有两个,