在上一篇博客中 , 遇到 在 DataBinding 布局 中 , 向 TextView 组件设置 int 类型数据的情况会报错 , 最终的处理方式是 将 int 类型的变量 student.age
通过 String.valueOf
函数转为 字符串 类型 , 设置到 TextView 组件中 ;
<TextView
android:id="@+id/textView"
android:text="@{String.valueOf(student.age)}" />
此外 , 还可以 在 数据类 中定义 字符串拼接函数 , 直接在 DataBinding 布局文件中 , 调用字符串拼接函数 ;
class Student(var name: String, var age: Int) {
fun nameText(): String {
return "姓名 : ${name}"
}
fun ageText(): String {
return "年龄 : ${age}"
}
}
在 DataBinding 布局文件中 , 声明 kim.hsl.databinding_demo.Student
类型的 对象 student ;
<data>
<variable
name="student"
type="kim.hsl.databinding_demo.Student" />
data>
布局文件中的组件中 ,
@{student.nameText()}
设置 "姓名 : ${name}"
字符串内容 ;@{student.ageText()}
设置 "年龄 : ${age}"
字符串内容 ;布局文件代码示例 :
<layout 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">
<data>
<variable
name="student"
type="kim.hsl.databinding_demo.Student" />
data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Tom"
android:text="@{student.nameText()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.4" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="18"
android:text="@{student.ageText()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2"
app:layout_constraintVertical_bias="0.2" />
androidx.constraintlayout.widget.ConstraintLayout>
layout>
在 DataBinding 布局中 , 如果想要为 View 组件绑定点击事件 , 需要绑定参数为 View 类型 , 返回值 void 的函数即可 ;
在 Student 类中定义如下函数 :
fun onClick(view: View): Unit {
Log.i("", "${nameText()} ${ageText()} 触发点击事件")
}
完整代码如下 :
package kim.hsl.databinding_demo
import android.util.Log
import android.view.View
class Student(var name: String, var age: Int) {
fun nameText(): String {
return "姓名 : ${name}"
}
fun ageText(): String {
return "年龄 : ${age}"
}
fun onClick(view: View): Unit {
Log.i("", "${nameText()} ${ageText()} 触发点击事件")
}
}
在 DataBinding 中 View 组件的 android:onClick
属性中 设置 @{student.onClick}
点击函数 ;
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Tom"
android:text="@{student.nameText()}"
android:onClick="@{student.onClick}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.4" />
点击该组件后 , 会自动触发事件 ;
除了将 字符串拼接 函数定义在 传入的 Student 对象中之外 , 还可以 定义在任意类的 静态方法 中 ;
注意 : 只能在 DataBinding 布局中调用静态方法 ;
<data>
<variable
name="student"
type="kim.hsl.databinding_demo.Student" />
data>
首先 , 定义一个 Java 类 , 在其中定义静态方法 , 接收一个值 , 拼接字符串 ;
package kim.hsl.databinding_demo;
public class JavaStudentUtils {
public static String nameText(String name) {
return "姓名 : " + name;
}
public static String ageText(int age) {
return "年龄 : " + age;
}
}
然后 , 在 标签中 , 导入相应的类 , 如下面的
kim.hsl.databinding_demo.JavaStudentUtils
类 ;
<data>
<variable
name="student"
type="kim.hsl.databinding_demo.Student" />
<import type="kim.hsl.databinding_demo.JavaStudentUtils" />
data>
最后 , 在 DataBinding 布局的 View 组件中 的 android:text
属性 , 设置 @{JavaStudentUtils.nameText(student.name)}
属性值 , 通过调用 JavaStudentUtils.nameText 静态方法 , 设置最终显示hi的文本 ;
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Tom"
android:text="@{JavaStudentUtils.nameText(student.name)}"
android:onClick="@{student.onClick}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.4" />
首先 , 定义一个 Kotlin 类 , 在其中的 companion object 伴生对象 定义 Java 静态方法 , 接收一个值 , 拼接字符串 ;
package kim.hsl.databinding_demo
class KotlinStudentUtils {
companion object {
@JvmStatic
fun nameText(name: String): String {
return "姓名 : " + name
}
@JvmStatic
fun ageText(age: Int): String {
return "年龄 : " + age
}
}
}
然后 , 在 标签中 , 导入相应的类 , 如下面的
kim.hsl.databinding_demo.JavaStudentUtils
类 ;
<data>
<variable
name="student"
type="kim.hsl.databinding_demo.Student" />
<import type="kim.hsl.databinding_demo.KotlinStudentUtils" />
data>
最后 , 在 DataBinding 布局的 View 组件中 的 android:text
属性 , 设置 @{KotlinStudentUtils.nameText(student.name)}
属性值 , 通过调用 KotlinStudentUtils.nameText 静态方法 , 设置最终显示hi的文本 ;
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="18"
android:text="@{KotlinStudentUtils.ageText(student.age)}"
android:onClick="@{student.onClick}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2"
app:layout_constraintVertical_bias="0.2" />
在该数据类中 , 定义了字符串拼接函数 , 点击事件函数 ;
该数据类对象需要在 DataBinding 布局文件中 , 需要通过如下方式导入 ;
<data>
<variable
name="student"
type="kim.hsl.databinding_demo.Student" />
data>
代码示例 :
package kim.hsl.databinding_demo
import android.util.Log
import android.view.View
class Student(var name: String, var age: Int) {
fun nameText(): String {
return "姓名 : ${name}"
}
fun ageText(): String {
return "年龄 : ${age}"
}
fun onClick(view: View): Unit {
Log.i("", "${nameText()} ${ageText()} 触发点击事件")
}
}
在 Java 类中 , 可以直接定义 静态方法 , 在 DataBinding 布局中调用 ;
package kim.hsl.databinding_demo;
public class JavaStudentUtils {
public static String nameText(String name) {
return "姓名 : " + name;
}
public static String ageText(int age) {
return "年龄 : " + age;
}
}
在 Kotlin 类中 , 需要在 companion object 伴生对象 中使用 @JvmStatic 注解修饰函数 , 才能定义 Java 静态函数 ;
package kim.hsl.databinding_demo
class KotlinStudentUtils {
companion object {
@JvmStatic
fun nameText(name: String): String {
return "姓名 : " + name
}
@JvmStatic
fun ageText(age: Int): String {
return "年龄 : " + age
}
}
}
在布局文件中 , 导入 Student 对象 , 和 定义了静态函数的类 ;
绑定点击事件 :
android:onClick="@{student.onClick}"
拼接字符串 :
android:text="@{JavaStudentUtils.nameText(student.name)}"
代码示例 :
<layout 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">
<data>
<variable
name="student"
type="kim.hsl.databinding_demo.Student" />
<import type="kim.hsl.databinding_demo.JavaStudentUtils" />
<import type="kim.hsl.databinding_demo.KotlinStudentUtils" />
data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Tom"
android:text="@{JavaStudentUtils.nameText(student.name)}"
android:onClick="@{student.onClick}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.4" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="18"
android:text="@{KotlinStudentUtils.ageText(student.age)}"
android:onClick="@{student.onClick}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2"
app:layout_constraintVertical_bias="0.2" />
androidx.constraintlayout.widget.ConstraintLayout>
layout>
package kim.hsl.databinding_demo
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import kim.hsl.databinding_demo.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 设置布局文件
// 布局文件是 activity_main.xml
// 该类名称生成规则是 布局文件名称 + Binding
var activityMainBinding: ActivityMainBinding =
DataBindingUtil.setContentView(this, R.layout.activity_main)
// 为布局 设置 数据
activityMainBinding.student = Student("Jerry", 13)
}
}