搞定Android DataBinding-01

搞定Android DataBinding-00主要是变量的绑定,如果需要加载图片,怎么办呢?
实际上,绑定变量的时候调用的是setter方法(TextView的”android:text”就是调用setText(String)),那么就应该支持绑定到自己指定的方法。

BindingAdapter

绑定一个下载图片的方法:需要图片URL和ImageView来显示,让这个方法能直接调用,最简单的就先定义为static

    @BindingAdapter({"imageUrl"})
    public static void imageLoader(ImageView imageView, String url) {
        Picasso.with(imageView.getContext()).load(url).into(imageView);
    }

绑定了上面的方法,当一个ImageView设置了”imageUrl”属性,就会调用imageLoader()方法。

BindingAdapter 属性

这样定义好之后,就可以图片下载了。

    <ImageView 
        android:layout_margin="@dimen/activity_horizontal_margin" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:scaleType="centerInside" 
        app:imageUrl='@{imgUrl ?? "http://0v7.jpg"}'/>

BindingAdapter 再加个参数

当加载文件失败的时候,使用失败的Drawable。
参数的顺序要一致:
{“imageUrl”, “error”}
(ImageView imageView, String url, Drawable error)

    @BindingAdapter({"imageUrl", "error"})
    public static void imageLoader(ImageView imageView, String url, Drawable error) {
        Picasso.with(imageView.getContext())
                .load(url)
                .error(error)
                .into(imageView);

    }

BindingAdapter 参数属性

ImageView定义的属性,可以用来当作imageLoader的函数参数。

    <ImageView 
        android:layout_margin="@dimen/activity_horizontal_margin" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:scaleType="centerInside" 
        app:imageUrl='@{imgUrl ?? "http://0v7.jpg"}'
        app:error="@{@drawable/ic_image_load_error}"/>

几个方法说明

带ID的view可以直接访问

带ID的view可以直接访问,会生成public final成员。

    //布局文件中
    <Button android:id="@+id/btn_change_image" .../>
    //Binding.java 中
    public final Button btnChangeImage;

完全可以替代Butter Knife

    mBinding.btnChangeImage.setOnClickListener(this);

资源文件的引用

大多数资源文件都可以使用,不过theme、style还好像不行。

//可以使用的
@stringArray,@intArray,@typedArray,
@animator,@stateListAnimator,@color,@colorStateList
//属性使用单引号['],表达式中使用双引号["]:
bind:actInfo='@{map["change_color"]}'
//属性值使用双引号["],表达式中使用["] = &quot; 或者反引号[`]
bind:actInfo="@{map[&quot;change_image&quot;]}"
bind:actInfo="@{map[`activity_c`]}"

源码

GitHub地址:AndroidDataBindingTutorial

发表评论

电子邮件地址不会被公开。 必填项已用*标注