DataBinding: ¿Cómo obtener el recurso por id dinámico?

Sé que es posible hacer referencia a los recursos en el diseño por su id de recurso:

android:text="@{@string/resourceName}" 

Sin embargo, me gustaría hacer referencia a recurso por id que se conoce sólo en tiempo de ejecución. Como un ejemplo simple, imagine que tenemos tal modelo:

 public class MyPOJO { public final int resourceId = R.string.helloWorld; } 

Y ahora necesito usar este valor como un valor en una cadena de formato. Llamémoslo

 <string name"myFormatString">Value is: %s</string> 

El enfoque más directo no funciona:

 android:text="@{@string/myFormatString(myPojo.resourceId)} 

Esto acaba de poner el valor entero en el marcador de posición (también demuestra que he inicializado mi POJO correctamente, así que no estoy proporcionando todo el diseño aquí).

También intenté usar @BindingConversion , pero no trabajó (que se espera realmente, pero intenté de todos modos) – int fue asignado todavía al placeholder y el método de enlace no fue llamado.

¿Cómo puedo explícitamente obtener recursos por su id en la biblioteca de DataBinding?

Otra solución es crear un @BindingAdapter personalizado para ello.

 @BindingAdapter({"format", "argId"}) public static void setFormattedText(TextView textView, String format, int argId){ if(argId == 0) return; textView.setText(String.format(format, textView.getResources().getString(argId))); } 

Y luego sólo proporcione las variables por separado.

 <TextView app:format="@{@string/myFormatString}" app:argId="@{myPojo.resourceId}" 

Usted podría utilizar un arreglo si usted necesita argumentos múltiples, pero en mi caso, uno era suficiente.

A partir de junio de 2016 esto es posible en XML:

 android:text= "@{String.format(@string/my_format_string, myPojo.resourceId)}" 

Terminé creando mi propio método:

 public class BindingUtils { public static String string(int resourceId) { return MyApplication .getApplication() .getResources() .getString(resourceId); } } 

Declaración de una importación para ella:

 <data> <import type="com.example.BindingUtils" /> ... </data> 

Y sólo llamarlo durante la encuadernación:

 android:text="@{@string/myFormatString(BindingUtils.string(myPojo.resourceId))}" 

Sería bueno tener un método "out-of-the-box" para eso. DataBinding es sitll en Beta – así que tal vez llegará en el futuro.

  • Utilizar el complemento Android DataBinding en paralelo con Google Plugin de servicios
  • Operaciones aritméticas en el diseño - vinculación de datos de Android
  • Cómo combinar componentes de arquitectura con vinculación de datos en android?
  • Enlace de datos - ¿Cómo escribir declaraciones de varias líneas?
  • Android Data binding, El valor del atributo "android: text" asociado con un tipo de elemento "TextView" no debe contener el carácter '<'
  • Enlace de datos bidireccional con doble valor en EditText
  • Diseño TabHost y DataBinding
  • Android DataBinding y MVVM - Utilizar los mismos archivos de diseño para diferentes condiciones utilizando los mismos modelos de vista
  • Establecer el color del texto mediante el enlace de datos en Android
  • Ejemplo de enlace de datos de 2 vías de android no funcionan como se describe
  • Vinculación de datos - safeUnbox warning
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.