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

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

例如:

布局/ web_view.xml

  

Bindings.java

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

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

布局/ web_view.xml

  

Bindings.java

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

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

这里有一些设置。

ContextUtils.java

以下方法将context主题和可选style attr解析为颜色。 如果出现错误,则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 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在此处的问题评论中所解释的那样。