欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kotlin(6)简单Android控件

程序员文章站 2024-02-10 23:44:34
...

Kotlin(六)简单Android控件的使用

kotlin中控件对象的获取将不再需要类似于findViewById这样的方法来获取,直接使用布局文件中的id就可以获取到对应的控件对象

一.按钮

1.Button

关于按钮的使用需要注意的还是它的三种点击响应的写法以及在匿名函数的方式下视图对象没有使用时的最简形式:

  • 匿名函数的形式
btn.setOnClickListener{
    v -> toast("控件: ${(v as Button).text}被点击")
}
当视图对象v没有被用到时,就可以去除即去除v后就是最简形式
btn.setOnClickListener{
    toast("button控件被点击")
}
  • 内部类的形式
private inner class MyBtnListener : View.OnClickListener {
    override fun onClick(v : View) {
        toast("控件: ${(v as Button).text}被点击")
    }
}

btn.setOnClickListener(MyBtnListener())
  • 接口实现方式
class DemoActivity : AppCompatActivity, OnClickListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.demo)

        btn.setOnClickListener(this)
    }

    override fun onClick(v : View) {
        if (v.id == R.id.btn) {
            toast("控件: ${(v as Button).text}被点击")
        }
    }
}

2.CheckBox

复选框只有两种状态,要么被选中要么没有被选中,它和单选按钮RadioButton、开关按钮Switch都继承自抽象按钮类CompoundButton

class DemoActivity : AppCompatActivity, OnClickListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.demo)

        //CheckBox cb = findViewById(R.id.cb)//kotlin中将不再需要findviewbyid,直接用布局中的id来表示控件对象
        cb.isChecked = false//默认为未选中
        cb.setOnCheckedChangeListener { buttonView, isChecked ->
            toast(" ${ if (isChecked) "勾选" else "取消勾选"} ")
        }
    }
}

3.RadioButton

单选按钮要存在于一组按钮中且不可以多选,这组按钮就是一个容器,这个容器就是RadioGroup,RadioGroup就是一个特殊的线性布局,可以通过orientation属性来指定一组按钮的排列方向,它下面也可以挂载TextView、Button等其它控件。而且单选按钮的点击不由RadioButton响应而是由RadioGroup来响应:

rg.setOnCheckedChangeListener(group, checkedId - >
    tv.text = when(checkedId) {
        R.id.boy -> "男孩"
        R.id.girl -> "女孩"
        else -> ""
    }
)

二.图文控件

1.TextView

kotlin中的TextView在其静态文本的功能上加入了一些动态的效果,比如就由跑马灯功能,就是当一行文本过长而无法显示全部时就可以不用换行直接让文本从右往左滚动显示。下面就是跑马灯的代码示例:

tv_hello.text = "据说明天有雨有雪有冰雹,有事没事都不要出门,被砸死冻死摔死就不好了,特别是年纪大的,一大把年纪了心里得有点数"
tv_hello.textSize = 17f
tv_hello.setTextColor(Color.parseColor("#3385FF"))
tv_hello.setBackgroundColor(Color.WHITE)
tv_hello.gravity = Gravity.START or Gravity.CENTER//左对齐且垂直居中
tv_hello.ellipsize = TextUtils.TruncateAt.MARQUEE//从右往左滚动
tv_hello.setSingleLine(true)//设置为单行显示

从上述代码我们可以看到有些属性可以直接赋值而不需要用set方法,另外特别说一下ellipsize这个属性的几个值:

  • TextUtils.TruncateAt.MARQUEE:跑马灯效果
  • TextUtils.TruncateAt.START:省略号在开头
  • TextUtils.TruncateAt.END:省略号在末尾
  • TextUtils.TruncateAt.MIDDLE:省略号在中间

还有就是在设置对齐属性gravity时用到了or关键字,它代替了java中的“|”符号,kotlin中将java的一些逻辑运算符号都用关键字进行了替换:

运算 kotlin java
按位与 and &
按位或 or |
按位异或 xor ^
按位左移 shl <<
按位右移 shr >>
无符号右移,高位补零 ushr >>>

 

 

 

 

 

 

 

 

2.ImageView

视图控件常用的几个方法:

  • setImageDrawable:设置图形的drawable对象
  • setImageResource:设置图像资源ID
  • setImageBitmap:设置图像的位图对象
  • setScaleType:设置图像拉伸类型

3.EditText

kotlin中可以给inputType属性直接赋值:

  • InputType.TYPE_CLASS_TEXT:所有文本
  • InputType.TYPE_CLASS_NUMBER:只能是数字
  • InputType.TYPE_CLASS_DATATIME:只能是日期时间
  • InputType.TYPE_TEXT_VARIATION_NORMAL:正常显示
  • InputType.TYPE_TEXT_VARIATION_PASSWORD:密文显示
  • InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:明文密码

而且EditText内置了一个编辑观察期EditWatcher,它可以实时监控用户输入的字符,比如说要输入11位的手机号,那么当用户输完11位字符后会自动触发手机号码可用性校验,这里就要用到EditWatcher。以下是代码示例:

et_phone.setText("")
et_phone.inputType = InputType.TYPE_CLASS_NUMBER
et_phone.addTextChangedListener(MyEditWatcher())

private inner class MyEditWatcher : TextWatcher {
    override fun beforeTextChanged(s:CharSequence, start:Int, count:Int, after:Int) {}
    
    override fun onTextChanged(s:CharSequence, start:Int, before:Int, count:Int) {}
    
    override fun afterTextChanged(s:Editable) {
        var str = s.toString()
        if (str.length >= 11) {
            ...
        }
    }
}