什么是BindindAdapter
范围:指定
效果:对指定的标签,将数据传入到其中
当DataBinding框架算出binding表达式的值之后,能够让我们介入,让我们根据求出的值的情形来执行各种各样的操作
DataBinding框架确实给我们提供了这样的介入机制,这就是BindingAdapter。
@BindingAdapter("android:visibility")
public static void bindVisibility(@NonNull View view, @Nullable Boolean visible) {
int visibility = (visible != null && visible) ? View.VISIBLE : View.GONE;
view.setVisibility(visibility);
}
https://www.jianshu.com/p/686bfc58bbb0
什么是BindingConversion
范围:全局
效果:观察全局,将可能需要转换的都进行转换
例子
//转换!!
//将Action 转换为View.onClickLickener
//然后DataBinding会自动在绑定的方法中找到符合要求的方法进行转换。
//但是,依然有可能影响到其他属性
// 例如这个 @BindingConversion- convertColorToString 就会影响到android:visibility, 因为他们都是都符合从 int 到 int 的转换。 https://juejin.im/entry/578c6bc77db2a2005c003a58
@BindingConversion
public static View.OnClickListener toOnClickListener(final Action listener) {
if (listener != null) {
return new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
listener.run();
} catch (Exception e) {
e.printStackTrace();
}
}
};
} else {
return null;
}
}
这样之后,对象View.OnclikListener的layout中的部分就会通过这个尝试转换,这样之后,传入action就可以完成onClick
ViewModel中
public final Action onTwoWayBindingClick = new Action() {
@Override
public void run() throws Exception {
navigator.navigateToTwoWayBindingDemo();
}
};
layout中
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{vm.onTwoWayBindingClick}"
android:text="@string/title_two_way_binding" />
https://juejin.im/entry/578c6bc77db2a2005c003a58
双向绑定,动态更新
public final ObservableField<String> number1 = new ObservableField<>("");
ViewModel的名字规则
这个我真的,,,
参考:https://stackoverflow.com/questions/49528437/caused-by-java-lang-illegalargumentexception-couldnt-make-a-guess-for-com-exa
回答:
Its because of you class name or package name which use databinding. These class( which use databinding) have to start with capital word and packages start with lowercase.
也就是包名小写开头,ViewModel类名 大写开头
创建了ViewModel却各种报错
第一:使用ViewModel,是需要AS自动创建类的,而AS自动创建类的触发情况是:layout文件中的声明。所以想测试的话,也要先写出layout的。不然就会报错
第二:android studio有时候会意识不到动态生成的文件。方法:File > Invalidate Caches/Restart… and select Invalidate Caches and Restart.
参考:https://stackoverflow.com/questions/35126670/android-data-binding-error-cannot-find-symbol-class