文章目录
- 一、字符串拼接函数
- 二、绑定点击事件函数
- 三、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)}}