用Kotlin开发Android应用,自定义控件TitleLayout.kt如下: package com.example.activitytest import android.app.Activity import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.widget.Button import android.widget.Toast import androidx.constraintlayout.widget.ConstraintLayout //import kotlinx.android.synthetic.main.title.view.*
class TitleLayout(context: Context, attrs: AttributeSet) : ConstraintLayout(context, attrs) {
init {
// 先膨胀布局
LayoutInflater.from(context).inflate(R.layout.title_layout, this, true)
val titleBack: Button = findViewById(R.id.titleBack)
val titleEdit: Button = findViewById(R.id.titleEdit)
titleBack.setOnClickListener {
val activity = context as Activity
activity.finish()
}
titleEdit.setOnClickListener {
Toast.makeText(context, "You clicked Edit button", Toast.LENGTH_SHORT).show()
}
}
}
title_layout.xml如下:
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content">
<Button
android:id="@+id/titleBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Back"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<TextView
android:id="@+id/titleText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Title Text"
android:textColor="#fff"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/titleEdit"
app:layout_constraintStart_toEndOf="@+id/titleBack"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/titleEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Edit"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
先需要优化代码,将findViewById的方法用自动绑定的方进行改造,请尽量采用当前最新的主流的lib和函数进行优化,避免采用不推荐的方法,避免出现编译错误。
为了优化代码并使用最新的主流库和函数,我们可以使用View Binding来替代findViewById
方法。View Binding是Google推荐的用于替代findViewById
的方式,它可以在编译时生成绑定类,从而避免运行时的空指针异常。
首先,需要在项目的build.gradle
文件中启用View Binding:
android {
...
viewBinding {
enabled = true
}
}
接下来,我们需要修改TitleLayout.kt
文件以使用View Binding。以下是优化后的代码:
package com.example.activitytest
import android.app.Activity
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.Toast
import androidx.constraintlayout.widget.ConstraintLayout
import com.example.activitytest.databinding.TitleLayoutBinding
class TitleLayout(context: Context, attrs: AttributeSet) : ConstraintLayout(context, attrs) {
private val binding: TitleLayoutBinding = TitleLayoutBinding.inflate(LayoutInflater.from(context), this, true)
init {
binding.titleBack.setOnClickListener {
val activity = context as Activity
activity.finish()
}
binding.titleEdit.setOnClickListener {
Toast.makeText(context, "You clicked Edit button", Toast.LENGTH_SHORT).show()
}
}
}
在这个优化后的版本中,我们使用了TitleLayoutBinding
类来替代findViewById
方法。TitleLayoutBinding
类是由View Binding在编译时自动生成的,它包含了title_layout.xml
中所有视图的引用。
这样做的好处是:
确保在title_layout.xml
文件中没有任何变化,因为View Binding会根据这个XML文件自动生成绑定类。