Cómo vincular un layout_width y layout_height mediante el enlace de datos en Android

Estoy tratando de enlazar un booleano que indica a un ImageView si el tamaño de la pantalla es pequeño, por lo que se reduce si necesito más espacio para otros componentes. Estoy usando la biblioteca DataBinding para hacerlo.

Mi diseño cuya anchura y altura depende de este booleano:

... <data> ... <variable name="smallScreen" type="boolean"/> ... </data> ... <ImageView android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" android:layout_gravity="center_horizontal" android:contentDescription="@{message}" android:src="@{image}" android:scaleType="center" tools:src="@drawable/img_message_private"/> ... 

Si sólo intento construir mi proyecto como este, el compilador dice que layout_width no puede aceptar tipo float. Lo suficientemente justo, utilizo la clase BindingAdapter para crear un float enter para los atributos de diseño, de la siguiente manera:

 ... @BindingAdapter("android:layout_width") public static void setLayoutWidth(View view, float width) { ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); layoutParams.width = (int) width; view.setLayoutParams(layoutParams); } @BindingAdapter("android:layout_height") public static void setLayoutHeight(View view, float height) { ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); layoutParams.height = (int) height; view.setLayoutParams(layoutParams); } ... 

Eso permite construir mi proyecto. Pero cuando el diseño está finalmente siendo procesado, caigo en la siguiente excepción:

 java.lang.RuntimeException: Binary XML file line #21: You must supply a layout_width attribute. 

Sólo para información, mis dimensiones se establecen en unidades dp, de la siguiente manera:

 <dimen name="img_small_screen_size">100dp</dimen> <dimen name="img_big_screen_size">208dp</dimen> 

¿Alguien sabe cómo puedo anular el atributo layout_width para poder usar databind directamente con dimensiones?

Lo acabo de averiguar cuando escribí mi pregunta. Acabo de usar otro atributo para enlazar el que quería cambiar, el código terminó así:

 <ImageView android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" android:layout_gravity="center_horizontal" android:contentDescription="@{message}" android:src="@{image}" android:scaleType="center" tools:src="@drawable/img_message_private"/> 

Así que mi BindingAdapters se convirtió en esto:

 @BindingAdapter("android:layout_width") public static void setLayoutWidth(View view, float width) { ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); layoutParams.width = (int) width; view.setLayoutParams(layoutParams); } @BindingAdapter("android:layout_height") public static void setLayoutHeight(View view, float height) { ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); layoutParams.height = (int) height; view.setLayoutParams(layoutParams); } 

Debe agregar un valor predeterminado, es decir,

 android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size, default=wrap_content}" 
  • Android TextView debe desplazarse verticalmente automáticamente
  • Leer / escribir en un archivo XML externo en Android
  • Android: IME sin teclado
  • Dynamic Center Aligned ViewPager
  • Eclipse no muestra errores de XML
  • Adaptador de llamada de reconocimiento de voz de Android
  • Android Studio - Autocompletar de XML Editor no funciona con bibliotecas de soporte
  • ¿Cómo activar el botón "Compartir" en la aplicación Android?
  • Swich imágenes de fondo se extiende al personalizar en android
  • Se muestra Google Maps Android sólo pantalla en blanco
  • "El contenido tiene vista con el atributo id 'android.r.id.list' que no es una clase ListView." Cuando se crea una vista de lista en un fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.