【Jetpack】DataBinding 架构组件 ② ( 字符串拼接函数 | 绑定点击事件函数 | DataBinding 布局中使用 import 标签导入 Java、Kotlin 类 )





一、字符串拼接函数



在上一篇博客中 , 遇到 在 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}" 字符串内容 ;

布局文件代码示例 :

<?xml version="1.0" encoding="utf-8"?>
<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" />

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

在这里插入图片描述





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



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

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

    <data>
        <variable
            name="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;
    }
}

然后 ,<data> 标签中 , 导入相应的类 , 如下面的 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" />

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_demo

class KotlinStudentUtils {
    
    
    companion object {
    
    
        @JvmStatic
        fun nameText(name: String): String {
    
    
            return "姓名 : " + name
        }

        @JvmStatic
        fun ageText(age: Int): String {
    
    
            return "年龄 : " + age
        }
    }
}

然后 ,<data> 标签中 , 导入相应的类 , 如下面的 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" />




四、完整代码示例




1、数据类


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

该数据类对象需要在 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()} 触发点击事件")
    }
}

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_demo

class KotlinStudentUtils {
    
    
    companion object {
    
    
        @JvmStatic
        fun nameText(name: String): String {
    
    
            return "姓名 : " + name
        }

        @JvmStatic
        fun ageText(age: Int): String {
    
    
            return "年龄 : " + age
        }
    }
}

4、DataBinding 布局文件


在布局文件中 , 导入 Student 对象 , 和 定义了静态函数的类 ;

绑定点击事件 :

android:onClick="@{student.onClick}"

拼接字符串 :

android:text="@{JavaStudentUtils.nameText(student.name)}"

代码示例 :

<?xml version="1.0" encoding="utf-8"?>
<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>

5、Activity 组件类


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)
    }
}

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/129808671