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" />

Bindings.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" />

Bindings.java

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

3 に答える 3

1

が Java@{android.R.attr.textColorPrimary}の値に解決される場合、それを色に解決するだけです。android.R.attr.textColorPrimary

これにはちょっとした設定があります。

ContextUtils.java

次のメソッドは、指定された のテーマとオプションを色に解決attrcontextますstylefallbackエラーがあればカラーに戻ります。

@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私のライブラリで利用可能なより複雑なコード( hereおよびhere )。

Bindings.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 に答える