DataBinding详解
一、开启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详解相关推荐
- WebService技术详解CXF
WebService WebService简介 Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Servic ...
- Android 8.0学习(32)---Android 8.0源码目录结构详解
Android 8.0源码目录结构详解 android的移植按如下流程: (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来. (2)正确挂载文件系统 ...
- Android 各大厂面试题汇总与详解(持续更新)
介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...
- Android 开发架构-MVC MVP MVVM详解
何为架构 架构,即程序的逻辑组织结构,是指导开发过程中划分程序逻辑模块的关键,好的架构要使程序达到高内聚低耦合的设计目标.例如一个人,身体的骨骼即为身体的架构,有了基本骨架之后,才可以决定在头颅里开发 ...
- 关于ClassLoader的学习笔记,详解版
ClassLoader 详解 ClassLoader 做什么的? 延迟加载 各司其职 ClassLoader 传递性 双亲委派 Class.forName 自定义加载器 Class.forName v ...
- MVC、MVP、MVVM结合案例详解-附Demo
本篇以登陆模块功能详解MVC.MVP.MVVM的优缺点及使用. 目录 一.MVC 1.概念 2.总结 二.MVP 1.概念 2.总结 三.MVVM 1.概念 2.Android Data Bindin ...
- Android开发经验的有效总结,附架构师必备技术详解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EJfyi76-1617950848926)(//upload-images.jianshu.io/upload_ima ...
- 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)
首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...
- JVM年轻代,老年代,永久代详解
秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...
最新文章
- 常用windows命令
- Kubernetes — 安装 Metrics Server
- 数据可视化高级部分:如何使用轨迹地图对路径数据进行分析
- 头回遇见网上找不到的问题,“缺少实例ID,实例ID是必需的”
- KNNClassifier
- 四、Vue组件化开发学习笔记——父子组件通信,父级向子级传值(props),子级向父级传值(自定义事件),slot插槽
- 单源最短路径算法---Dijkstra
- 三次握手的本质_关于TCP三次握手,这是我见过最好的解读了,通俗易懂
- .Net资源文件全球化
- mysql漏洞如何打补丁_WordPress 5.1 CSRF to RCE 漏洞详解
- 中山大学计算机学院离散数学,《离散数学》课程习题与解答(2011级使用)中山大学计算机科学系_推荐.pdf...
- kindle可以上网但是无法下载_两年深度使用经验告诉你:Kindle 这样用,绝对不吃灰...
- C++ 五大链表排序(冒泡、插入、选择、归并、快排)
- 怎样把flac转换成mp3?四个步骤完成
- Axure视频教程2:制作第一个原型
- 电信:自娱自乐的全员揽装,让人心寒!
- 【TcaplusDB知识库】TcaplusDB进程启动介绍
- 计算机课吐槽,让上课更有趣!这位老师的课学生可发弹幕提问吐槽
- 《钟馗伏魔:雪妖魔灵》另类解读
- 基于众包的可视化图表数据提取