用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>
在third_layout.xml中include以上自定义控件:
<?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" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ThirdActivity">
<!-- Include the custom title layout -->
<include
android:id="@+id/titleLayout"
layout="@layout/title_layout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/button3"
android:layout_width="245dp"
android:layout_height="65dp"
android:text="第3_打开浏览器"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/titleLayout"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
但是在运行时,在third_layout的界面点击titleBack和titleEdit,都没有反应,是怎么回事?如何修复?
在你的代码中,TitleLayout
是一个自定义控件,并且你在 third_layout.xml
中通过 <include>
标签包含了这个自定义控件。问题的根源在于 <include>
标签只是简单地将布局文件嵌入到另一个布局文件中,但不会保留自定义控件的逻辑和行为。
要解决这个问题,你需要直接在 third_layout.xml
中使用 TitleLayout
自定义控件,而不是通过 <include>
标签来包含它。这样可以确保 TitleLayout
的初始化逻辑(包括点击事件的设置)能够正确执行。
以下是修改后的 third_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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ThirdActivity">
<!-- Use the custom TitleLayout directly -->
<com.example.activitytest.TitleLayout
android:id="@+id/titleLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/button3"
android:layout_width="245dp"
android:layout_height="65dp"
android:text="第3_打开浏览器"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/titleLayout"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
通过这种方式,TitleLayout
的初始化逻辑会被正确执行,点击事件也会正常工作。
此外,确保 TitleLayout
的包名和路径是正确的,并且在 AndroidManifest.xml
中正确声明了 ThirdActivity
。如果仍然有问题,请检查日志输出(Logcat)以获取更多调试信息。