本章节讲述Kotlin中各种View的声明赋值点击事件,比如TextView,EditText,ImageView。这些在Java语言中是最最基础的东西。写这篇文章的主要目的就是看一下Kotlin语言中有什么不同。

代码

class KotlinActivity2 : AppCompatActivity() {

    //View的声明
    private lateinit var textView: TextView
    private lateinit var editText: EditText
    private lateinit var imageView: ImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_kotlin2)
        initView()
    }

    /**
     * 初始化View
     * */

    @SuppressLint("SetTextI18n")
    private fun initView() {
        //View的初始化
        textView = findViewById(R.id.textView)
        editText = findViewById(R.id.editText)
        imageView = findViewById(R.id.imageView)

        //View的赋值
        textView.text = "我是Kotlin的TextView"
        editText.setText("我是Kotlin的EditText")
        imageView.setBackgroundResource(R.drawable.ic_launcher_background)

        //View的点击事件
        textView.setOnClickListener {
            val intent = Intent(this, MainActivity2::class.java)
            intent.putExtra("name", "张三")
            startActivity(intent)
        }
        imageView.setOnClickListener{

        }
    }
}

结果

初始

android kotlin 自定义view_Kotlin延时初始化

展示

android kotlin 自定义view_Kotlin延时初始化_02

最简单的View声明,View初始化,View赋值。没什么可讲的。下面我们对照Java语言来说一下几个区别。

一.类继承

Java

public class MainActivity extends AppCompatActivity

class关键字声明一个类 如果想继承AppCompatActivity类 使用extends关键字即可。

Kotlin

class KotlinActivity2 : AppCompatActivity()

class关键字声明一个类 如果想继承AppCompatActivity类 使用   : +类名+()。这个就是Kotlin和Java的区别。

注意

我们创建一个类时。

Java语言中默认创建的类带有public,如上。也就是默认创建的Java类是public类型的。也就是可以被其他类继承。

Kotlin语言中默认创建的类没有任何修饰符,如上。也就是说默认创建的Kotlin类是final类的。不可以被其他类继承。那么如果想把创建的Kotlin类可以被其他类继承呢?

我们可以使用open关键字。举例如下

如果KotlinActivity2类如下

class KotlinActivity2 : AppCompatActivity()

另外一个类GaoJieFun 想要继承KotlinActivity2类 

class GaoJieFun :KotlinActivity2()

报错提示

android kotlin 自定义view_Kotlin TextView_03

即提示 KotlinActivity2类是final类型的,要想继承这个类需要把这个类改成open类型的。

修改

open class KotlinActivity2 : AppCompatActivity()

类GaoJieFun 继承KotlinActivity2类

class GaoJieFun :KotlinActivity2()

成功。

二.View声明

如上,Kotlin中声明View时都加了一个关键字lateinit。那么这个关键字可不可以不加,以及这个关键字的作用是什么呢?

1.不加lateinit关键字声明View 代码

private  var textView: TextView

private lateinit var editText: EditText

private lateinit var imageView: ImageView

报错信息

android kotlin 自定义view_View延时初始化_04

 也就是说,Kotlin中View的声明必须加lateinit关键字。

2.lateinit关键字的作用

lateinit关键字的作用是  推迟变量的初始化。

因为

在Kotlin中,必须在声明对象时初始化对象的属性。这意味着,当您获取类的实例时,可以立即引用它的任何可访问属性。

但是

由于Android中各种View的声明比较特殊,因为在Activity中只有在onCreate方法中调用findViewById后,各种View才可以初始化。

所以

在Kotlin中,需要一种方法来推迟 View 的属性初始化。即使用lateinit关键字。

3.lateinit关键字的其他说明

不能用来修饰基本数据类型。因为基本数据类型在声明时会有默认值,比如int类型默认0。

代码

private lateinit var m:Int = 0

报错

android kotlin 自定义view_Kotlin延时初始化_05

<2>.lateinit不能修饰val变量,只能修饰可变的属性。

代码

private lateinit var string: String

正确

代码

private lateinit val string: String

报错

android kotlin 自定义view_lateinit 推迟初始化_06

<3>.总结

lateinit关键字 在Kotlin中 主要用来延时初始化View。其他的基本变量或者val常量不可以使用。其他可以使用的变量,在使用时也需要格外谨慎。个人建议只在View的声明时使用。

三.View点击事件

View的点击事件,也是非常简单的操作。我们还是看一下Java和Kotlin的区别。

Java代码

textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        
    }
});

Kotlin代码

textView.setOnClickListener {
   
}

Java的语法咱们就不说了,咱们看一下Kotlin的。可见Kotlin的点击事件语法很简单。就是

view.setOnClickListener{}。然后在大括号内写具体的逻辑即可。

四.类引用

如上,简单的Intent页面跳转时

Java代码

Intent intent = new Intent(this, MainActivity2.class);

intent.putExtra("name", "张三")

startActivity(intent);

Kotlin代码

val intent = Intent(this, MainActivity2::class.java)

intent.putExtra("name", "张三")

startActivity(intent)

也就是,引入类时,Java直接使用  类名.class  即可。而Kotlin需要 类名::class.java。