一、开启DataBinding

//在build.gradle文件添加
android{dataBinding{enabled true}
}

二、生成DataBinding布局

1、光标在布局文件的根布局-->点击Alt + Enter-->点击 “Convert to data binding layout

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="100dp"android:layout_height="100dp"/></LinearLayout>
</layout>

2、创建数据类

class Test{var aa = "aaaaa"var background: Int = 0
}

3、在data中声明变量及类全名

<data><variablename="test"type="com.lpf.myapplication.Test" />
</data>

4、可以通过导包方式简化类全路径;重名类通过设置别名导包

<data><import type="com.lpf.myapplication.Test"/><import alias="TestAbc"type="com.abc.content.Test"/><variablename="test1"type="Test" /><variablename="test2"type="TestAbc" />
</data>

5、通过@{test1.aa}使用变量;通过@{test.aa,default=12345}设置默认值(默认值无需加引号,且只在预览视图显示)

<TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:text="@{test1.aa}"android:textSize="18sp"android:background="@{test1.background}"/><TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:text="@{test2.aa,default=12345}"android:textSize="18sp"/>

6、include布局

<includelayout="@layout/layout_title"bind:test="@{test}"/>//layout_title.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="test"type="com.hualala.myapplication.Test" /></data><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{test.aa}"/></LinearLayout>
</layout>

7、DataBinding不支持merge标签

三、设置数据

1、在activity中使用(DataBinding布局都会自动生成绑定类,其中绑定类命名规则:布局文件名首字母大写且省去下划线+Binding)

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val dataBinding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)val test = Test()test.aa = "aaaa"test.background = ContextCompat.getColor(this, R.color.colorAccent)dataBinding.test = test
}

注:另外绑定类还可以直接通过控件id获取控件

2、在fragment中使用

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {val testFragmentBinding = DataBindingUtil.inflate<TestFragmentBinding>(inflater, R.layout.test_fragment, container, false)return testFragmentBinding.root
}

3、recyclerview中使用

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val dataBinding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)//通过id获取recyclerviewdataBinding.recyclerViewId.layoutManager = LinearLayoutManager(this)dataBinding.recyclerViewId.adapter = TestAdapter()
}class TestAdapter : RecyclerView.Adapter<TestAdapter.TestViewHolder>(){private val testList = arrayListOf<Test>()init {for (i in 1..5){val test = Test()test.aa = "第{$i}条"testList.add(test)}}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestViewHolder {val binding = DataBindingUtil.inflate<ItemTestBinding>(LayoutInflater.from(parent.context), R.layout.item_test, parent, false)return TestViewHolder(binding)}override fun getItemCount(): Int {return testList.size}override fun onBindViewHolder(holder: TestViewHolder, position: Int) {holder.mBinding.test = testList[position]}class TestViewHolder(binding: ItemTestBinding) : RecyclerView.ViewHolder(binding.root) {val mBinding: ItemTestBinding = binding}
}

四、数据绑定

基本类型ObservableBoolean、ObservableByte、ObservableChar、ObservableShort、ObservableInt、ObservableLong、ObservableFloat、ObservableDouble 以及 ObservableParcelable ,也可通过 ObservableField 泛型来申明其他类型,还可以通过ObservableArrayList、ObservableArrayMap使用集合类型。其中“@={test.aa}”可以实现双向绑定。

class Test{val aa = ObservableField<String>()val bb = ObservableInt()val cc = ObservableArrayMap<String, Drawable>()
}
object MapKey {const val background = "background"
}
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val dataBinding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)var test = Test()dataBinding.test = testtest.aa.set("标题")test.bb.set(ContextCompat.getColor(this, R.color.colorAccent))test.cc[MapKey.background] = ContextCompat.getDrawable(this, R.drawable.ic_launcher_background)
}
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="test"type="com.hualala.myapplication.Test" /><variablename="key"type="com.hualala.myapplication.MapKey" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{test.aa}"android:textColor="@{test.bb}"android:background="@{test.cc[key.background]}"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@={test.aa}"/></LinearLayout>
</layout>

五、事件绑定

方法参数和原生事件参数一致可以使用"@{presenter::onClickOne}",不一致可以通过Lambda表达式"@{()-> presenter.onClickTwo(test)}"

class MainPresenter {fun onClickOne(view: View){Toast.makeText(view.context, "11111", Toast.LENGTH_SHORT).show()}fun onClickTwo(test: Test){Log.i("aa", "*******${test.aa.get()}")}
}
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="test"type="com.hualala.myapplication.Test" /><variablename="presenter"type="com.hualala.myapplication.MainPresenter" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{test.aa}"android:onClick="@{presenter::onClickOne}"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{test.aa}"android:onClick="@{()-> presenter.onClickTwo(test)}"/></LinearLayout>
</layout>
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val dataBinding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)var test = Test()dataBinding.presenter = MainPresenter()dataBinding.test = testtest.aa.set("按钮")}

六、调用静态方法

class StringUtil {companion object{@JvmStatic//需要添加该注解,否则xml中找不到该方法fun toUpperCase(string: String): String{return string.toUpperCase()}}
}
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><import type="com.hualala.myapplication.StringUtil"/><variablename="test"type="com.hualala.myapplication.Test" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{StringUtil.toUpperCase(test.aa)}"/></LinearLayout>
</layout>

七、运算符

  • 算术    +  -  /  *  %
  • 字符串合并   +
  • 逻辑    &&   ||
  • 二元    &  |  ^
  • 一元    +  -   !  ~
  • 移位    >>   >>>   <<
  • 比较    ==  >  <   >=   <=   !=
  • 三元   ?:
  • 空合并  ??      ("@{test.aa ?? test.bb}"等价于“@{test.aa!=null?test.aa:test.bb}”)

八、BindingAdapter自定义属性

1、声明属性(静态方法,kotlin需要加@JvmStatic注解)

class ImageUtil{companion object{@JvmStatic@BindingAdapter("url")fun loadImage(imageView: ImageView, url: String){Log.e("aa", "*********$url")}}
}

注:check that the adapter is annotated correctly and that the parameter type matches异常,需要在build.gradle中添加apply plugin: 'kotlin-kapt'

2、引用属性(bind可以自定义)

<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:bind="http://schemas.android.com/apk/res-auto"><data><import type="com.hualala.myapplication.ImageUtil"/></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"bind:url='@{"http://test.png"}'/></LinearLayout>
</layout>

注:包含字符串外层需要用单引号,如 android:text='@{"字符串"}'

九、BindingConversion数据转换

同类型转换,如conversionString添加前缀;不同类型转换如conversionStringToDrawable

object ImageUtil{@JvmStatic@BindingAdapter("url")fun loadImage(imageView: ImageView, url: String){Log.e("aa", "*********$url")}//同类型转换@JvmStatic@BindingConversionfun conversionString(str: String): String{return "http://$str"}//不同类型转换@JvmStatic@BindingConversionfun conversionStringToDrawable(str: String): Drawable{return ColorDrawable(Color.parseColor(str))}
}
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:bind="http://schemas.android.com/apk/res-auto"><data><import type="com.hualala.myapplication.ImageUtil"/><variablename="test"type="com.hualala.myapplication.Test" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background='@{"#FF0000"}'><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"bind:url='@{"test.png"}'/></LinearLayout>
</layout>

注:

(1)@BindingConversion比@BindingAdapter先执行

(2)@BindingConversion使用companion object方式定义静态方法,会报异常@BindingConversion is only allowed on public static methods conversionString(String),采用Object方式定义静态方法即可

十、资源引用

<resources><string name="test_to_test">%s to %s</string>
</resources>
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text='@{@string/test_to_test("a","b")}'/>

DataBinding详解相关推荐

  1. WebService技术详解CXF

    WebService WebService简介 Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Servic ...

  2. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  3. Android 各大厂面试题汇总与详解(持续更新)

    介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...

  4. Android 开发架构-MVC MVP MVVM详解

    何为架构 架构,即程序的逻辑组织结构,是指导开发过程中划分程序逻辑模块的关键,好的架构要使程序达到高内聚低耦合的设计目标.例如一个人,身体的骨骼即为身体的架构,有了基本骨架之后,才可以决定在头颅里开发 ...

  5. 关于ClassLoader的学习笔记,详解版

    ClassLoader 详解 ClassLoader 做什么的? 延迟加载 各司其职 ClassLoader 传递性 双亲委派 Class.forName 自定义加载器 Class.forName v ...

  6. MVC、MVP、MVVM结合案例详解-附Demo

    本篇以登陆模块功能详解MVC.MVP.MVVM的优缺点及使用. 目录 一.MVC 1.概念 2.总结 二.MVP 1.概念 2.总结 三.MVVM 1.概念 2.Android Data Bindin ...

  7. Android开发经验的有效总结,附架构师必备技术详解

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EJfyi76-1617950848926)(//upload-images.jianshu.io/upload_ima ...

  8. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  9. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

最新文章

  1. 常用windows命令
  2. Kubernetes — 安装 Metrics Server
  3. 数据可视化高级部分:如何使用轨迹地图对路径数据进行分析
  4. 头回遇见网上找不到的问题,“缺少实例ID,实例ID是必需的”
  5. KNNClassifier
  6. 四、Vue组件化开发学习笔记——父子组件通信,父级向子级传值(props),子级向父级传值(自定义事件),slot插槽
  7. 单源最短路径算法---Dijkstra
  8. 三次握手的本质_关于TCP三次握手,这是我见过最好的解读了,通俗易懂
  9. .Net资源文件全球化
  10. mysql漏洞如何打补丁_WordPress 5.1 CSRF to RCE 漏洞详解
  11. 中山大学计算机学院离散数学,《离散数学》课程习题与解答(2011级使用)中山大学计算机科学系_推荐.pdf...
  12. kindle可以上网但是无法下载_两年深度使用经验告诉你:Kindle 这样用,绝对不吃灰...
  13. C++ 五大链表排序(冒泡、插入、选择、归并、快排)
  14. 怎样把flac转换成mp3?四个步骤完成
  15. Axure视频教程2:制作第一个原型
  16. 电信:自娱自乐的全员揽装,让人心寒!
  17. 【TcaplusDB知识库】TcaplusDB进程启动介绍
  18. 计算机课吐槽,让上课更有趣!这位老师的课学生可发弹幕提问吐槽
  19. 《钟馗伏魔:雪妖魔灵》另类解读
  20. 基于众包的可视化图表数据提取

热门文章

  1. 什么是 Wi-Fi 6 (802.11ax)?为什么 Wi-Fi 6 很重要?
  2. SPRING系列一之 依赖注入
  3. (一)SDRAM——SDRAM入门介绍
  4. android 浏览器控件
  5. PR CC2019启动出现crash桌面文件
  6. Mobius反演学习
  7. 网络协议-TCP协议详解
  8. 【控制工程】自动控制原理和系统建模
  9. DXP封装中如何实现开孔
  10. fread函数和fwrite函数的用法