文章目录

  • 一、字符串拼接函数
  • 二、绑定点击事件函数
  • 三、DataBinding 布局中使用 import 标签导入 Java、Kotlin 类
    • 1、DataBinding 布局中使用 import 标签导入 Java 类
    • 2、DataBinding 布局中使用 import 标签导入 Kotlin 类
  • 四、完整代码示例
    • 1、数据类
    • 2、导入的 Java 类
    • 3、导入的 Kotlin 类
    • 4、DataBinding 布局文件
    • 5、Activity 组件类

一、字符串拼接函数


在上一篇博客中 , 遇到 在 DataBinding 布局 中 , 向 TextView 组件设置 int 类型数据的情况会报错 , 最终的处理方式是 将 int 类型的变量 student.age 通过 String.valueOf 函数转为 字符串 类型 , 设置到 TextView 组件中 ;

<TextViewandroid: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><variablename="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><variablename="student"type="kim.hsl.databinding_demo.Student" /></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid: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" /><TextViewandroid: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_demoimport android.util.Logimport android.view.Viewclass 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} 点击函数 ;

<TextViewandroid: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" />

点击该组件后 , 会自动触发事件 ;

三、DataBinding 布局中使用 import 标签导入 Java、Kotlin 类


除了将 字符串拼接 函数定义在 传入的 Student 对象中之外 , 还可以 定义在任意类的 静态方法 中 ;

注意 : 只能在 DataBinding 布局中调用静态方法 ;

<data><variablename="student"type="kim.hsl.databinding_demo.Student" /></data>

1、DataBinding 布局中使用 import 标签导入 Java 类

首先 , 定义一个 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><variablename="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的文本 ;

<TextViewandroid: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" />

2、DataBinding 布局中使用 import 标签导入 Kotlin 类

首先 , 定义一个 Kotlin 类 , 在其中的 companion object 伴生对象 定义 Java 静态方法 , 接收一个值 , 拼接字符串 ;

  • 在 Kotlin 中定义 Java 静态方法 : 需要在 companion object 伴生对象 中使用 @JvmStatic 注解修饰函数 ;
  • 在 Kotlin 中定义 Java 静态成员 : 需要在 companion object 伴生对象 中使用 @JvmField 注解修饰字段 ;
  • 特别注意 : 只有在 companion object 伴生对象 中 , 才能使用 @JvmStatic 和 @JvmField 注解 ;
package kim.hsl.databinding_democlass KotlinStudentUtils {companion object {@JvmStaticfun nameText(name: String): String {return "姓名 : " + name}@JvmStaticfun ageText(age: Int): String {return "年龄 : " + age}}}

然后 , 标签中 , 导入相应的类 , 如下面的 kim.hsl.databinding_demo.JavaStudentUtils 类 ;

<data><variablename="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的文本 ;

<TextViewandroid: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" />

四、完整代码示例


1、数据类

在该数据类中 , 定义了字符串拼接函数 , 点击事件函数 ;

该数据类对象需要在 DataBinding 布局文件中 , 需要通过如下方式导入 ;

<data><variablename="student"type="kim.hsl.databinding_demo.Student" /></data>

代码示例 :

package kim.hsl.databinding_demoimport android.util.Logimport android.view.Viewclass 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()} 触发点击事件")}}

2、导入的 Java 类

在 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;}}

3、导入的 Kotlin 类

在 Kotlin 类中 , 需要在 companion object 伴生对象 中使用 @JvmStatic 注解修饰函数 , 才能定义 Java 静态函数 ;

package kim.hsl.databinding_democlass KotlinStudentUtils {companion object {@JvmStaticfun nameText(name: String): String {return "姓名 : " + name}@JvmStaticfun ageText(age: Int): String {return "年龄 : " + age}}}

4、DataBinding 布局文件

在布局文件中 , 导入 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><variablename="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.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid: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" /><TextViewandroid: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>

5、Activity 组件类

package kim.hsl.databinding_demoimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport androidx.databinding.DataBindingUtilimport kim.hsl.databinding_demo.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 设置布局文件// 布局文件是 activity_main.xml// 该类名称生成规则是 布局文件名称 + Bindingvar activityMainBinding: ActivityMainBinding =DataBindingUtil.setContentView(this, R.layout.activity_main)// 为布局 设置 数据activityMainBinding.student = Student("Jerry", 13)}}