DataBinding使用注意事项点:
1、变量声明variable后,需要在binding中赋值
2、xml中用到的类,需要import,如控制View的显示隐藏,需要导入View类
3、int类型对应为Integer,且在@{}用于text时候,需要转为String
4、在@{}中可以使用``反引号作为String,注意非英文编码可能出错,甚至会编译报错
5、资源引用使用@string、@color、@drawable等,IDE不会补全,注意拼写无误
6、使用default设置默认值,用于预览编辑
7、null判空配合??使用,默认值可以``反引号、资源引用或者变量、静态函数值
8、String的format使用也是可以``、@string或者其他变量等
9、静态函数,java的写法和kotlin的写法不同,实质都是jvm虚拟机的静态函数化
10、函数调用的多种写法,无参、有参、context,以及静态函数调用(针对对象,而非类)。
1. 配置文件,启动 dataBinding,在 Application Module的build.gradle中
- apply plugin: 'org.jetbrains.kotlin.kapt' //必须
-
- android {
- //方式1 AS 4.0以下
- /*dataBinding {
- enabled = true
- }*/
-
- //方式二 AS 4.1之后
- buildFeatures{
- dataBinding = true
- //for view binding
- //viewBinding = true
- }
- }
2. 项目 build.gradle 中
- plugins {
- id "org.jetbrains.kotlin.kapt" version '1.7.10' apply false
- }
3. 布局文件 activity_base_use.xml
- <layout xmlns:tools="http://schemas.android.com/tools">
-
- <data>
-
- <variable
- name="title"
- type="String" />
-
- <variable
- name="age"
- type="Integer" />
-
- <variable
- name="name"
- type="String" />
-
- <variable
- name="isStudent"
- type="Boolean" />
-
- <variable
- name="ages"
- type="List<String>" />
-
- <variable
- name="map"
- type="Map<Integer,String>" />
-
- <variable
- name="helper"
- type="BindHelp" />
-
- <import type="android.view.View" />
-
- <import type="java.util.List" />
-
- <import type="java.util.Map" />
-
- <import type="org.hanyang.jetpack.binding.tools.BindTool" />
-
- <import type="org.hanyang.jetpack.binding.tools.BindUtilKt" />
-
- <import
- alias="BU"
- type="org.hanyang.jetpack.binding.tools.BindUtil" />
-
- <import type="org.hanyang.jetpack.binding.tools.BindHelp" />
- data>
-
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="10dp">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:orientation="horizontal">
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="5dp"
- android:text="@{age+ ` years old`}"
- tools:text="title text" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="5dp"
- android:text="@{@string/str_reference}"
- tools:text="str 引用" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="5dp"
- android:text="@{name, default = `默认Name`}" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="5dp"
- android:text="@{title ?? `null of title`}" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="5dp"
- android:text="@{@string/str_format(`zhangsan`)}" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="5dp"
- android:text="@{`Pre_` + @string/str_reference + title}"
- tools:text="str 的拼接" />
- LinearLayout>
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="是学生就显示"
- android:textColor="@android:color/holo_green_light"
- android:visibility="@{isStudent ? View.VISIBLE : View.GONE, default = `gone`}" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="5dp"
- android:text="@{@plurals/str_numbers(0)}"
- tools:text="str的格式化" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{BindTool.nameAge(name, age)}"
- android:textColor="@android:color/holo_blue_light"
- tools:text="静态函数" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{BindUtilKt.ageName(age,name)}"
- android:textColor="@{isStudent?@android:color/holo_blue_light:@android:color/holo_purple}"
- tools:text="kt 静态函数" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{BU.ageAge(age) + BindHelp.nameName(name)}"
- android:textColor="@android:color/holo_purple"
- tools:text="Kt object 静态函数" />
-
- <androidx.appcompat.widget.AppCompatTextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{ages[1] +` `+ map[20]}"
- android:textColor="@android:color/holo_purple"
- tools:text="list和map" />
-
- <androidx.appcompat.widget.AppCompatButton
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="@{()->BindTool.log()}"
- android:text="普通无参(Logcat)" />
-
- <androidx.appcompat.widget.AppCompatButton
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="@{(v)->BindTool.toast(v)}"
- android:text="普通View参数"
- android:textAllCaps="false" />
-
- <androidx.appcompat.widget.AppCompatButton
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="@{()->BindUtilKt.toastV(context)}"
- android:text="Context参数"
- android:textAllCaps="false" />
-
- <androidx.appcompat.widget.AppCompatButton
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="@{BindHelp::staticClick}"
- android:text="静态函数应用点击" />
- LinearLayout>
- layout>
4. 工具类
4.1 BindTool.java
- /**
- * java版的用于xml的dataBinding的静态函数类,kotlin的写法,参照BindUtil中
- */
- public class BindTool {
-
- /**
- * 简单的一个静态函数,databinding在xml中使用的函数,必须是public的static函数
- *
- * @param name 名称
- * @param age 年龄
- * @return string的拼接
- */
- public static String nameAge(String name, int age) {
- return name + age;
- }
-
- /**
- * 点击就打印一个log
- */
- public static void log() {
- Log.i("BindTool", "dataBinding的普通点击,静态java函数的log日志");
- }
-
- /**
- * 使用view参数,显示toast
- *
- * @param view view控件
- */
- public static void toast(View view) {
- Toast.makeText(view.getContext(), "普通点击View显示Toast", Toast.LENGTH_SHORT).show();
- }
- }
4.2 BindUtil.kt
- /**
- * ----------------------------------------------------------------
- * todo Kotlin的一大特点,文件内可以多个类,函数。java则不能多个public的类,也不能函数。
- * 用于xml中dataBinding的静态函数.不同于java的public static函数写法。这里kotlin中有两种写法:
- * 1、直接定义在kt文件的top level顶级,直接写函数名。调用方导入BindUtilKt,使用BindUtilKt.ageName应用。
- * 2、定义在一个静态类object中。在kotlin中就是object的静态类,或者companion object的类中。需要@jvmStatic标记才有效
- */
-
- /**
- * 用于xml的 databinding 中,这是在 kt 文件顶级写法,不需要 static 标记
- */
- fun ageName(age: Int, name: String?): String {
- return "Kt 函数: $age $name"
- }
-
- /**
- * [context] 参数弹toast
- */
- fun toastV(context: Context) {
- Toast.makeText(context, "Context弹出Toast", Toast.LENGTH_SHORT).show()
- }
-
- /**
- * 这是在 class 类中 companion 的object 中
- */
- class BindUtil {
- companion object {
- @JvmStatic
- fun ageAge(age: Int): String {
- return "年龄 $age"
- }
- }
- }
-
- /**
- * 写在object中
- */
- object BindHelp {
- @JvmStatic
- fun nameName(name: String?): String {
- return "姓名 $name"
- }
-
- /**
- * 用于view的静态点击
- */
- @JvmStatic
- fun staticClick(view: View) {
- Toast.makeText(view.context, "静态函数引用", Toast.LENGTH_SHORT).show()
- }
- }
5. 测试页面 BindingActivity.kt
- /**
- * dataBinding的基础用法演示界面
- */
- class BaseUseActivity : AppCompatActivity() {
- /*
- DataBinding使用步骤简要:
- 1、使用最新版的AndroidStudio,至少AS3.0以上吧。
- 2、在项目module下的build.gradle的android闭包下,配置 databinding{enabled=true}
- 3、对于布局的xml文件,将原有的正常布局,外面用
包裹作为跟节点。节点下存放用于xml布局的一些变量,工具类之类的 - 4、在代码无误的情况下,build一下module或整个project。然后就可以在代码中使用binding方式coding了。
- */
-
- //
- //
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- //Activity使用DataBindingUtil.setContentView的方式关联xml布局文件,替代原有的setContentView方式。其中`ActivityBaseUseBinding`为databinding根据xml自动生成的类文件
- //命名方式为layout的name+Binding。(可以自定义名称,在标签内的className属性)
- val binding = DataBindingUtil.setContentView
( - this,
- R.layout.activity_base_use
- )
- //设置在xml中声明的变量值
- binding.age = 20
- binding.isStudent = true
- binding.title = "BD标题"
- //BindName
- binding.name = "Na"
- //list,map 这里的ages和map,赋值给xml中的变量
- val ages = listOf("20", "30", "10")
- val map = mapOf(19 to "Lily", 21 to "Jim", 20 to "Aili")
- binding.ages = ages
- binding.map = map
- //静态点击的helper
- binding.helper = BindHelp
- }
- }
6. 效果图