DataBinding实践

本文深入讲解DataBinding中的BindindAdapter和BindingConversion作用及用法,探讨双向绑定与动态更新机制,解析ViewModel命名规则及常见错误解决方法。

什么是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值