• DataBinding 基础用法


    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中

    1. apply plugin: 'org.jetbrains.kotlin.kapt' //必须
    2. android {
    3. //方式1 AS 4.0以下
    4. /*dataBinding {
    5. enabled = true
    6. }*/
    7. //方式二 AS 4.1之后
    8. buildFeatures{
    9. dataBinding = true
    10. //for view binding
    11. //viewBinding = true
    12. }
    13. }

    2. 项目 build.gradle 中

    1. plugins {
    2. id "org.jetbrains.kotlin.kapt" version '1.7.10' apply false
    3. }

    3. 布局文件 activity_base_use.xml

    1. <layout xmlns:tools="http://schemas.android.com/tools">
    2. <data>
    3. <variable
    4. name="title"
    5. type="String" />
    6. <variable
    7. name="age"
    8. type="Integer" />
    9. <variable
    10. name="name"
    11. type="String" />
    12. <variable
    13. name="isStudent"
    14. type="Boolean" />
    15. <variable
    16. name="ages"
    17. type="List<String>" />
    18. <variable
    19. name="map"
    20. type="Map<Integer,String>" />
    21. <variable
    22. name="helper"
    23. type="BindHelp" />
    24. <import type="android.view.View" />
    25. <import type="java.util.List" />
    26. <import type="java.util.Map" />
    27. <import type="org.hanyang.jetpack.binding.tools.BindTool" />
    28. <import type="org.hanyang.jetpack.binding.tools.BindUtilKt" />
    29. <import
    30. alias="BU"
    31. type="org.hanyang.jetpack.binding.tools.BindUtil" />
    32. <import type="org.hanyang.jetpack.binding.tools.BindHelp" />
    33. data>
    34. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    35. android:layout_width="match_parent"
    36. android:layout_height="match_parent"
    37. android:orientation="vertical"
    38. android:padding="10dp">
    39. <LinearLayout
    40. android:layout_width="match_parent"
    41. android:layout_height="wrap_content"
    42. android:gravity="center_vertical"
    43. android:orientation="horizontal">
    44. <androidx.appcompat.widget.AppCompatTextView
    45. android:layout_width="wrap_content"
    46. android:layout_height="wrap_content"
    47. android:layout_margin="5dp"
    48. android:text="@{age+ ` years old`}"
    49. tools:text="title text" />
    50. <androidx.appcompat.widget.AppCompatTextView
    51. android:layout_width="wrap_content"
    52. android:layout_height="wrap_content"
    53. android:layout_margin="5dp"
    54. android:text="@{@string/str_reference}"
    55. tools:text="str 引用" />
    56. <androidx.appcompat.widget.AppCompatTextView
    57. android:layout_width="wrap_content"
    58. android:layout_height="wrap_content"
    59. android:layout_margin="5dp"
    60. android:text="@{name, default = `默认Name`}" />
    61. <androidx.appcompat.widget.AppCompatTextView
    62. android:layout_width="wrap_content"
    63. android:layout_height="wrap_content"
    64. android:layout_margin="5dp"
    65. android:text="@{title ?? `null of title`}" />
    66. <androidx.appcompat.widget.AppCompatTextView
    67. android:layout_width="wrap_content"
    68. android:layout_height="wrap_content"
    69. android:layout_margin="5dp"
    70. android:text="@{@string/str_format(`zhangsan`)}" />
    71. <androidx.appcompat.widget.AppCompatTextView
    72. android:layout_width="wrap_content"
    73. android:layout_height="wrap_content"
    74. android:layout_margin="5dp"
    75. android:text="@{`Pre_` + @string/str_reference + title}"
    76. tools:text="str 的拼接" />
    77. LinearLayout>
    78. <androidx.appcompat.widget.AppCompatTextView
    79. android:layout_width="wrap_content"
    80. android:layout_height="wrap_content"
    81. android:text="是学生就显示"
    82. android:textColor="@android:color/holo_green_light"
    83. android:visibility="@{isStudent ? View.VISIBLE : View.GONE, default = `gone`}" />
    84. <androidx.appcompat.widget.AppCompatTextView
    85. android:layout_width="wrap_content"
    86. android:layout_height="wrap_content"
    87. android:layout_margin="5dp"
    88. android:text="@{@plurals/str_numbers(0)}"
    89. tools:text="str的格式化" />
    90. <androidx.appcompat.widget.AppCompatTextView
    91. android:layout_width="wrap_content"
    92. android:layout_height="wrap_content"
    93. android:text="@{BindTool.nameAge(name, age)}"
    94. android:textColor="@android:color/holo_blue_light"
    95. tools:text="静态函数" />
    96. <androidx.appcompat.widget.AppCompatTextView
    97. android:layout_width="wrap_content"
    98. android:layout_height="wrap_content"
    99. android:text="@{BindUtilKt.ageName(age,name)}"
    100. android:textColor="@{isStudent?@android:color/holo_blue_light:@android:color/holo_purple}"
    101. tools:text="kt 静态函数" />
    102. <androidx.appcompat.widget.AppCompatTextView
    103. android:layout_width="wrap_content"
    104. android:layout_height="wrap_content"
    105. android:text="@{BU.ageAge(age) + BindHelp.nameName(name)}"
    106. android:textColor="@android:color/holo_purple"
    107. tools:text="Kt object 静态函数" />
    108. <androidx.appcompat.widget.AppCompatTextView
    109. android:layout_width="wrap_content"
    110. android:layout_height="wrap_content"
    111. android:text="@{ages[1] +` `+ map[20]}"
    112. android:textColor="@android:color/holo_purple"
    113. tools:text="list和map" />
    114. <androidx.appcompat.widget.AppCompatButton
    115. android:layout_width="wrap_content"
    116. android:layout_height="wrap_content"
    117. android:onClick="@{()->BindTool.log()}"
    118. android:text="普通无参(Logcat)" />
    119. <androidx.appcompat.widget.AppCompatButton
    120. android:layout_width="wrap_content"
    121. android:layout_height="wrap_content"
    122. android:onClick="@{(v)->BindTool.toast(v)}"
    123. android:text="普通View参数"
    124. android:textAllCaps="false" />
    125. <androidx.appcompat.widget.AppCompatButton
    126. android:layout_width="wrap_content"
    127. android:layout_height="wrap_content"
    128. android:onClick="@{()->BindUtilKt.toastV(context)}"
    129. android:text="Context参数"
    130. android:textAllCaps="false" />
    131. <androidx.appcompat.widget.AppCompatButton
    132. android:layout_width="wrap_content"
    133. android:layout_height="wrap_content"
    134. android:onClick="@{BindHelp::staticClick}"
    135. android:text="静态函数应用点击" />
    136. LinearLayout>
    137. layout>

    4. 工具类
      4.1 BindTool.java

    1. /**
    2. * java版的用于xml的dataBinding的静态函数类,kotlin的写法,参照BindUtil中
    3. */
    4. public class BindTool {
    5. /**
    6. * 简单的一个静态函数,databinding在xml中使用的函数,必须是public的static函数
    7. *
    8. * @param name 名称
    9. * @param age 年龄
    10. * @return string的拼接
    11. */
    12. public static String nameAge(String name, int age) {
    13. return name + age;
    14. }
    15. /**
    16. * 点击就打印一个log
    17. */
    18. public static void log() {
    19. Log.i("BindTool", "dataBinding的普通点击,静态java函数的log日志");
    20. }
    21. /**
    22. * 使用view参数,显示toast
    23. *
    24. * @param view view控件
    25. */
    26. public static void toast(View view) {
    27. Toast.makeText(view.getContext(), "普通点击View显示Toast", Toast.LENGTH_SHORT).show();
    28. }
    29. }

      4.2 BindUtil.kt

    1. /**
    2. * ----------------------------------------------------------------
    3. * todo Kotlin的一大特点,文件内可以多个类,函数。java则不能多个public的类,也不能函数。
    4. * 用于xml中dataBinding的静态函数.不同于java的public static函数写法。这里kotlin中有两种写法:
    5. * 1、直接定义在kt文件的top level顶级,直接写函数名。调用方导入BindUtilKt,使用BindUtilKt.ageName应用。
    6. * 2、定义在一个静态类object中。在kotlin中就是object的静态类,或者companion object的类中。需要@jvmStatic标记才有效
    7. */
    8. /**
    9. * 用于xml的 databinding 中,这是在 kt 文件顶级写法,不需要 static 标记
    10. */
    11. fun ageName(age: Int, name: String?): String {
    12. return "Kt 函数: $age $name"
    13. }
    14. /**
    15. * [context] 参数弹toast
    16. */
    17. fun toastV(context: Context) {
    18. Toast.makeText(context, "Context弹出Toast", Toast.LENGTH_SHORT).show()
    19. }
    20. /**
    21. * 这是在 class 类中 companion 的object 中
    22. */
    23. class BindUtil {
    24. companion object {
    25. @JvmStatic
    26. fun ageAge(age: Int): String {
    27. return "年龄 $age"
    28. }
    29. }
    30. }
    31. /**
    32. * 写在object中
    33. */
    34. object BindHelp {
    35. @JvmStatic
    36. fun nameName(name: String?): String {
    37. return "姓名 $name"
    38. }
    39. /**
    40. * 用于view的静态点击
    41. */
    42. @JvmStatic
    43. fun staticClick(view: View) {
    44. Toast.makeText(view.context, "静态函数引用", Toast.LENGTH_SHORT).show()
    45. }
    46. }

    5. 测试页面 BindingActivity.kt

    1. /**
    2. * dataBinding的基础用法演示界面
    3. */
    4. class BaseUseActivity : AppCompatActivity() {
    5. /*
    6. DataBinding使用步骤简要:
    7. 1、使用最新版的AndroidStudio,至少AS3.0以上吧。
    8. 2、在项目module下的build.gradle的android闭包下,配置 databinding{enabled=true}
    9. 3、对于布局的xml文件,将原有的正常布局,外面用包裹作为跟节点。节点下存放用于xml布局的一些变量,工具类之类的
    10. 4、在代码无误的情况下,build一下module或整个project。然后就可以在代码中使用binding方式coding了。
    11. */
    12. //
    13. //
    14. override fun onCreate(savedInstanceState: Bundle?) {
    15. super.onCreate(savedInstanceState)
    16. //Activity使用DataBindingUtil.setContentView的方式关联xml布局文件,替代原有的setContentView方式。其中`ActivityBaseUseBinding`为databinding根据xml自动生成的类文件
    17. //命名方式为layout的name+Binding。(可以自定义名称,在标签内的className属性)
    18. val binding = DataBindingUtil.setContentView(
    19. this,
    20. R.layout.activity_base_use
    21. )
    22. //设置在xml中声明的变量值
    23. binding.age = 20
    24. binding.isStudent = true
    25. binding.title = "BD标题"
    26. //BindName
    27. binding.name = "Na"
    28. //list,map 这里的ages和map,赋值给xml中的变量
    29. val ages = listOf("20", "30", "10")
    30. val map = mapOf(19 to "Lily", 21 to "Jim", 20 to "Aili")
    31. binding.ages = ages
    32. binding.map = map
    33. //静态点击的helper
    34. binding.helper = BindHelp
    35. }
    36. }

    6. 效果图

     

     

  • 相关阅读:
    腾讯云服务器多少钱一年?腾讯云服务器88元一年,附优惠购买入口
    详解 Spring Boot 项目中的配置文件
    Git(11)——Git相关问题解答以及常用命令总结
    【IoT】生产制造:锅仔片上机做 SMT 加工吗?
    QT5自定义下拉框为QTreeView类型(树形分上下级)的下拉框(QComboBox)(超详细步骤)
    计算机网络-数据链路层(流量控制与可靠传输机制(停止等待协议、滑动窗口协议(GBN,SR)))
    初识设计模式-策略模式-去掉别扭的if,满足开闭原则
    Docker | docker常用命令
    Vue学习第六天(9月13号)
    C语言 题目 1701: 数据结构-自顶向下的赫夫曼编码
  • 原文地址:https://blog.csdn.net/u011193452/article/details/126370438