¿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:
- Cómo obtener propiedades AttributeSet
- Android Studio: ¿Cómo mover rápidamente el estilo de layout.xml a style.xml?
- Diseño androide mostrar / mostrar vistas
- Cómo cambiar mediante programación la imagen de fondo de una actividad de Android
- Listview con encabezado y pie de página
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 }
- Problemas de procesamiento Excepción generada durante la renderización: las matrices de color y posición deben tener la misma longitud
- ViewPager wrap_content no funciona
- Norma de arquitectura de Android MVP para cargar interfaz de usuario con clase Model que tiene recurso android
- Obtener dimensiones redimensionables appwidget (o moverse alrededor)
- Android, barra de progreso en ActionBar, y eliminar el progreso de círculo
- Adición de un TableLayout dinámico con bordes en una aplicación para Android
- NoClassDefFoundError al ejecutar PopupMenu usando la biblioteca android-support-v7-appcompat en android
- ¿Cuál es la diferencia entre 'textEmailAddress' y 'textWebEmailAddress'
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 }