DataBinding 笔记
DataBinding 笔记
那些年踩过的坑
非
public
类型的变量,getter
方法必须有,没有就会报错:Could not find accessor xxx.xxx.FiledName
。原理是:DataBinding
需要给变量设置值、获取变量的值ObservableXX
类型的变量设置值时使用:fieldName.set()
方法;在布局文件中获取值时使用:fieldName
,在Java
文件中获取值时使用filedName.get()
(Java
文件中,fieldName
获取的是对象的地址)所有在布局文件中申明的变量,在使用前,都需要在
Java
文件中初始化。比如布局文件中使用了方法,就需要在Java
文件中实例化申明了交互方法的类在使用集合时(例如:
ObservableArrayList
),如果要指明集合的范型,使用import
引入范型的包把正常布局改为
databinding
类型的布局的正确姿势:在正常布局的最外面包裹layout
;把正常布局根节点上命名空间声明移到layout
节点上,把xml:tools
的申明必须
得移动到layout
上,否则布局预览上没有效果;把data
节点作为layout
节点的第一直接子元素控件
id
的值不要相同。如果有相同,在viewpager
使用时,按顺序向后翻页没有问题,但是向前翻页,会报错:java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.support.v7.widget.RecyclerView$SavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/common_rv. Make sure other views do not use the same id.
使用
BindingAdpter
为首个类型的控件定义一个属性,要想让它在Studio
的智能提示中出现,需要在res/values/attrs.xml
文件中,使用declare-styleable
申明自定义属性。属性的名称就是控件的名称(大小写一致),属性里的每个attr
节点都代表着自定义的每个属性特殊字符使用:
& - &
,< - <
,> - >
问题
动态布局(即代码生成的而已)是否可以使用
DataBinding
?在
Presenter
中,如何传入控件或变量(比如要改变可见性的TextView
,要显示、消失的ProgressDialog
)?如何给控件使用
DataBinding
设置marginXXX
属性?
3.1 使用@BindingAdapter("android:layout_marginTop")
注解
3.2 方法的第一个参数:View view
,第二个参数:float marginTop
3.3 注意:第二个参数类型一定得是float