36

Android 中的数据绑定目前似乎支持以下参考资源(根据数据绑定指南):@array, @color, @int, @dimen, @string... 这将在静态@BindingAdapter方法中将引用值作为参数提供。

例如:

布局/web_view.xml

<WebView
    app:htmlTextColor="@{@color/colorText}"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

绑定.java

@BindingAdapter({"bind:htmlTextColor"})
public static void setHtml(WebView webView, int textColor) {
    // binding logic
}

但是对于主题和样式,我更经常使用属性资源,例如,?android:attr/textColorPrimary而不是@color引用。对于这种情况,绑定"@{}"语法会是什么样子?目前这就是我让它工作的方式,但也许有更好的方法?

布局/web_view.xml

<WebView
    app:htmlTextColor="@{android.R.attr.textColorPrimary}"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

绑定.java

@BindingAdapter({"bind:htmlTextColor"})
public static void setHtml(WebView webView, int textColorAttr) {
    // binding logic
}
4

3 回答 3

1

使用 BindingAdapter

BindingAdapter允许您在将数据应用到视图之前对数据进行操作和执行更多涉及的逻辑。要使用BindingAdapter,首先在您的代码中创建一个绑定到标准 Android 属性或自定义属性的静态方法。

我在这里创建了一个名为 characterBackground 的自定义属性:

@BindingAdapter({"characterBackground"})
public static void characterBackground(TextView textView, AdventureTimeCharacters character) {
     textView.setBackgroundColor(ContextCompat.getColor(textView.getContext(), character.getColour()));
}

然后,您可以在 TextView 中使用此 BindingAdapter:

app:characterBackground="@{character}"

不要忘记添加应用命名空间!Android Studio 可以为你添加这个。只需输入 appNs,它就会自动完成。

此解决方案有效,但有点过于复杂。你说数据绑定很容易..

于 2019-09-06T07:46:17.163 回答
1

如果@{android.R.attr.textColorPrimary}解析为android.R.attr.textColorPrimaryJava 中的值,您需要做的就是将其解析为颜色。

这里面有一些设置。

ContextUtils.java

以下方法解析提供attrcontext主题和可选style的颜色。fallback如果出现错误,则返回颜色。

@ColorInt
public static int resolveColor(final Context context, @StyleRes final int style, @AttrRes final int attr, @ColorInt final int fallback) {
    final TypedArray ta = obtainTypedArray(context, style, attr);
    try {
        return ta.getColor(0, fallback);
    } finally {
        ta.recycle()
    }
}

@ColorInt
public static int resolveColor(final Context context, @AttrRes final int attr, @ColorInt final int fallback) {
    return resolveColor(context, 0, attr, fallback);
}

有助于有效实现上述目标的实用方法。

private static TypedArray obtainTypedArray(final Context context, @StyleRes final int style, @AttrRes final int attr): TypedArray {
    final int[] tempArray = getTempArray();
    tempArray[0] = attr;
    return context.obtainStyledAttributes(style, tempArray);
}

private static final ThreadLocal<int[]> TEMP_ARRAY = new ThreadLocal<>();

private static final int[] getTempArray() {
    int[] tempArray = TEMP_ARRAY.get();
    if (tempArray == null) {
        tempArray = int[1];
        TEMP_ARRAY.set(tempArray);
    }
    return tempArray;
}

android-commons我的库中提供了更复杂的代码(此处此处)。

绑定.java

以下是如何使用它:

@BindingAdapter({"bind:htmlTextColor"})
public static void setHtml(final WebView webView, @AttrRes final int textColorAttr) {
    final Context context = webView.getContext();
    final int textColor = ContextUtils.resolveColor(context, textColorAttr, Color.BLACK);

    // binding logic
}
于 2016-11-09T17:49:10.253 回答
0

正如@yigit 在此处问题的评论中所解释的那样,目前似乎不支持在具有数据绑定的布局表达式中使用主题。

于 2017-11-29T02:32:49.540 回答