迁移语雀 2021-2-22
Android 4.0 (API level 14) or higher
The Data Binding Library is a support library that allows you to bind UI components in your layouts to data sources in your app using a declarative format rather than programmatically.
DataBinding 是一个可以允许使用声明式(declarative)让我们在 layout 里把 UI 控件跟数据源绑定的库。
- Declarative UIs inside XML
- Binding the gap between code and XML
DataBinding 的优势:
- 在 layout 里做绑定可以省去很多代码,提升可维护性;
- 性能更好,防止空指针。
https://developer.android.com/topic/libraries/data-binding/expressions
- Mathematical
+ - / * %
- String concatenation
+
- Logical
&& ||
- Binary
& | ^
- Unary
+ - ! ~
- Shift
>> >>> <<
- Comparison
== > < >= <=
(Note that<
needs to be escaped as<
) instanceof
- Grouping
()
- Literals - character, String, numeric,
null
- Cast
- Method calls
- Field access
- Array access
[]
- Ternary operator
?:
举例:
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
The following operations are missing from the expression syntax that you can use in managed code:
this
super
new
- Explicit generic invocation
??
来判断对象是否为 null
android:text="@{user.displayName ?? user.lastName}"
相当于:
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
https://developer.android.com/topic/libraries/data-binding/observability.html
在这之前,当我们修改 Model UI 并不会更新,因为到这才是单向绑定,如果需要让 UI 随着我们 Model 的改动而自动更新,需要实现双向绑定,这时候我们需要使用到 Observable data objects。
DataBinding 提供了把对象、字段和集合变得可观察,来实现双向绑定,并提供了一些内置的对象:
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
使用的时候:
private static class User {
public final ObservableField<String> firstName = new ObservableField<>();
public final ObservableField<String> lastName = new ObservableField<>();
public final ObservableInt age = new ObservableInt();
}
需要注意,它们是对象,不能像基本类型直接使用,而是通过set
和get
方法。
//实例化
public ObservableInt weight = new ObservableInt(70);
// get() set() 方法
public void loseWeight() {
int pre = weight.get();
weight.set(--pre);
}
https://developer.android.com/topic/libraries/data-binding/architecture.html#livedata
LiveData 可以替代 observable fields
https://developer.android.com/topic/libraries/data-binding/generated-binding.html
https://developer.android.com/topic/libraries/data-binding/binding-adapters
属性跟布局的绑定实际上是由 BindingAdatpters 来完成的。
https://developer.android.com/topic/libraries/data-binding/two-way
DataBinderMapper
DataBinderMapperImpl
ViewDataBinding
BaseObservable
Observable
PropertyChangeRegistry
TextViewBindingAdapter
bind 的逻辑 属性 方法 getter 的优先级是怎么样的?
为什么说 DataBinding 的性能比较好?
为什么说 DataBinding 能防止空指针?(XBinding 的类里都判断了对象是否为 null)
https://developer.android.com/topic/libraries/data-binding
https://developer.android.com/topic/libraries/data-binding/architecture
https://developer.android.com/topic/libraries/data-binding/generated-binding.html
https://developer.android.com/topic/libraries/data-binding/binding-adapters.html
https://developer.android.com/topic/libraries/data-binding/architecture.html
compilerv2:https://juejin.im/entry/5af91556f265da0b736dc25e
https://medium.com/androiddevelopers/data-binding-lessons-learnt-4fd16576b719
文中 Demo 地址:https://github.com/AlanCheen/LearnDataBinding
https://codelabs.developers.google.com/codelabs/android-databinding/#2