data-binding 踩坑记

1. 如何向单个view传递多个binding参数

a. 在BindingAdapter中定义

@BindingAdapter({"position", "info"})
 public static void renderView(View view, int position, Info info) {
        view.renderView(position, info);
    }

b xml配置 position,info 属性即可。 这里点进BindingAdapter可以看到两个参数:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package android.databinding;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
public @interface BindingAdapter {
    String[] value();

    boolean requireAll() default true;
}

value 数组,binding的属性,requireAll是 bool参数 表示是否可选。

2 data- binding的一个bug:

当为某个view设置layout_width 时,使用官方的方法,binding一个dimen的资源会出现如下错误

1F2145CA-80F9-4914-AF93-7DEF4FDDCD09.png

目前我看到的一个workaround如下:

 @BindingAdapter("height")
    public static void setHeight(View view, float height) {
        ViewGroup.LayoutParams params = view.getLayoutParams();
        params.height = (int) height;
        view.setLayoutParams(params);
    }

其实就是1.提到的方法,但是我在实际使用的时候却存在空指针异常,因为view.getLayoutParams()可能为空。 这里需要判空下。

3 binding 资源 :

  1. res: 直接 在vm定义
public final ObservableField<Drawable> mDrawable = new ObservableField<>();

xml配置

android:drawableLeft="@{viewModel.mDrawable}"

4 binding 事件

vm中定义 回调即可

public final ObservableField<View.OnClickListener> mOnClickMoreView = new ObservableField<>();

5 binding参数顺序问题

当一个view出现多个参数时,如果你不是使用BindingAdapter一起设置参数的话,而是分别设置的话,小心一下参数顺序,binding按照xml 顺序读取,也就是说,这个就存在一个优先级,后面的参数可能覆盖一些前面的参数。

6 listView Click事件处理

工程较大时,我们有一个统一的ViewModel,恰好就是这个ViewModel,造成各种兼容问题。 比如我有一个需求,ViewGroup不拦截事件,而另外的同事需要拦截该事件。有人会说onclickbinding null就好,可行,但同事又binding了一个长按事件onLongClick,ok,还继续这样做。事实是然并卵。测试了下binding clickable,binding onLongClickable才可行。

7 binding include标签或merg标签

这里建议include 自己 binding一个ViewModel, 然后在include的父布局bind:ViewModel即可。

8 xml导入类,在data中添加类似如下即可

<import type="android.text.TextUtils"/>

9 note

listview复用的时候,小心绑定的属性未恢复,造成复用错误。 最重要的事,编译通不过时,注意vm中属性和xml的属性值是否相同。

下图是找不到对应的Longclick错误的事例。

nomethod.png

下面事例是没有做兼容,因为relativelayout没有对应的height属性的设置。

noviewbindingadapter.png

一个小的tips:

ViewModel的好处就是复用性较高,缺点就是处理view之间互动时会存在问题,比如在ViewModel怎么拿到一个view 并进行动画操作 a 一个处理方式是由外部bingding获取对应的view然后传入,然后做动画就好。 b 自定义一个ViewAdapter 这里比较局限性,只能banding对应的view。

 @BindingAdapter("showLoading")
    public static void showLoading(FrameLoading frameLoading, boolean loading) {
        if (loading) {
            frameLoading.start();
        } else {
            frameLoading.stop();
        }
    }

c 当我们使用系统view 的时候,如何binding呢,也就是我们采用部分binding的时候? 比如ActionBar?

            XXXBinding binding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.xxxlayout, new RelativeLayout(this), false);
            binding.setViewModel(vm);
            actionBar.setCustomView(binding.getRoot());

又是如何找到对应的binding呢?

 View customView = actionBar.getCustomView();
            XXXBinding binding = DataBindingUtil.findBinding(customView);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java 成神之路

spring 之 import标签、alias标签、beans标签 解析

604100
来自专栏向治洪

Android杀毒实现原理及实例

一个杀毒软甲最核心的部分一个是病毒库一个是杀毒引擎,病毒库从服务器中获得,杀毒引擎实际上是判断程序中的包名和签名是否匹配病毒库中的包名和签名,如果匹配则为病毒,...

29070
来自专栏Scott_Mr 个人专栏

RxSwift 实战操作【注册登录】

40760
来自专栏木宛城主

Unity应用架构设计(3)——构建View和ViewModel的生命周期

对于一个View而言,本质上是一个MonoBehaviour。它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等。...

24850
来自专栏Android开发指南

Android优化指南

53070
来自专栏非著名程序员

Android中如何提取和生成mp4文件

随着Android 4.4及以上版本的逐渐普及,Android 4.1引入的MediaExtractor类,以及Android 4.3引入的MediaMuxer...

29570
来自专栏葡萄城控件技术团队

Wijmo 更优美的jQuery UI部件集:导出Wijmo的GridView到Excel

Wijmo GridView 控件不提供导出Excel文件的方法。本篇博客介绍一种将Wijmo的GridView控件保存到Excel的简单方法。你可以使用同样的...

26580
来自专栏向治洪

系统捕获异常并发送到服务器

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个...

21070
来自专栏腾讯大讲堂的专栏

深入浅出 Retrofit,这么牛逼的框架你们还不来看看?

文章来源:腾讯Bugly Android 开发中,从原生的 HttpUrlConnection 到经典的 Apache 的 HttpClient,再到对前面这些...

33050
来自专栏Golang语言社区

GoLang并发控制(下)

context的字面意思是上下文,是一个比较抽象的词,字面上理解就是上下层的传递,上会把内容传递给下,在go中程序单位一般为goroutine,这里的上下文便是...

34030

扫码关注云+社区

领取腾讯云代金券