¿Utilizar recursos de atributos (? Attr /) en el enlace de diseño?

El enlace de datos en Android parece apoyar los siguientes recursos de referencia (de acuerdo con la guía de vinculación de datos ): @array , @color , @int , @dimen , @string … que dará los valores referenciados como argumentos en static @BindingAdapter .

Por ejemplo:

layout / 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 } 

Pero con temas y estilos , es más frecuente que utilice un recurso de atributo, por ejemplo ?android:attr/textColorPrimary que una referencia @color . En estos casos, ¿cómo se vería la sintaxis vinculante "@{}" ? Actualmente esto es cómo lo hago funcionar, pero tal vez hay una mejor manera?

layout / 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 } 

Si @{android.R.attr.textColorPrimary} resuelve el valor de android.R.attr.textColorPrimary en Java, todo lo que necesitas hacer es resolver que a un color.

Hay un poco de una configuración de entrar en esto.

ContextUtils.java

El método siguiente resuelve el attr del tema del context y el style opcional a un color. Cae de nuevo al color del fallback si hay un error.

 @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); } 

Métodos de utilidad que ayudan a lograr el objetivo anterior de manera eficiente.

 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; } 

Código más complejo disponible en mi biblioteca android-commons (esta parte escrita en Kotlin, toma lo que necesites).

Bindings.java

He aquí cómo usarlo:

 @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 } 
  • Android 5.0 Lollipop: setColorFilter "filtra" en otros botones
  • Sombra interna en el círculo
  • Android: ¿Cómo evitar las prensas fuera del círculo de un botón redondo utilizando el contenido?
  • Obtener el tamaño de un texto en TextView
  • Añadir vista horizontal y verticalmente en LinearLayout dinámicamente
  • Parte del fragmento dentro de ViewPager se corta en la parte inferior de la pantalla (Android)
  • Reducir márgenes en los diseños de Android
  • FindViewById (int) devuelve null para vistas personalizadas, pero no incorpora Android
  • "Ellipsize" sólo muestra un punto
  • Icono flotante en otras aplicaciones
  • Rotación a un ImageView, dentro de un RelativeLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.