在布局绑定中使用属性资源(?attr /)?

Android中的数据绑定目前似乎支持以下参考资源(根据数据绑定指南 ): @array @color@int @dimen@string @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 } 

如果@{android.R.attr.textColorPrimary}在Java中parsing为@{android.R.attr.textColorPrimary}的值,则只需将其parsing为一种颜色即可。

这里有一些设置。

ContextUtils.java

以下方法将context的主题和可选style attrparsing为一个颜色。 如果出现错误,则fallbackfallback颜色。

 @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库 (这部分写在Kotlin,拿你所需要的)。

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 } 

看起来,主题目前不支持在数据绑定的布局expression式中使用,正如@yigit在这里的问题的注释中所解释的那样。