Skip to content

绑定适配器

绑定适配器负责发出相应的框架调用来设置值。例如,设置属性值就像调用 setText() 方法一样。再比如,设置事件监听器就像调用 setOnClickListener() 方法。

对象转换

自动对象转换

当绑定表达式返回 Object 时,库会选择用于设置属性值的方法。 Object 会转换为所选方法的参数类型。对于使用 ObservableMap 类存储数据的应用,这种行为非常便捷,如以下示例所示:

<TextView
    android:text='@{userMap["lastName"]}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

还可以使用 object.key 表示法引用映射中的值。例如,以上示例中的 @{userMap["lastName"]} 可替换为 @{userMap.lastName}

表达式中的 userMap 对象会返回一个值,该值会自动转换为用于设置 android:text 特性值的 setText(CharSequence) 方法中的参数类型。 如果参数类型不明确,则必须在表达式中强制转换返回类型。

自定义转换

在某些情况下,需要在特定类型之间进行自定义转换。例如,视图的 android:background 特性需要 Drawable,但指定的 color 值是整数。以下示例展示了某个特性需要 Drawable,但结果提供了一个整数:

<View
    android:background="@{isError ? @color/red : @color/white}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

每当需要 Drawable 且返回整数时,int 都应转换为 ColorDrawable。您可以使用带有 BindingConversion 注释的静态方法完成这个转换,如下所示:

    @BindingConversion
    public static ColorDrawable convertColorToDrawable(int color) {
        return new ColorDrawable(color);
    }

但是,绑定表达式中提供的值类型必须保持一致。您不能在同一个表达式中使用不同的类型,如以下示例所示:

<!-- 不能这么做 -->
<View
       android:background="@{isError ? @drawable/error : @color/white}"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>