DataBinding: Как получить ресурс по динамическому идентификатору?

Я знаю, что можно ссылаться на ресурсы в макете по их идентификатору ресурса:

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

Однако я хотел бы ссылаться на ресурс по id, который известен только во время выполнения. В качестве простого примера предположим, что у нас есть такая модель:

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

И теперь мне нужно использовать это значение как значение в строке формата. Назовем это

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

Самый простой подход не работает:

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

Это просто добавит целочисленное значение в placeholder (также это доказывает, что я правильно инициализировал POJO, поэтому я не предоставляю весь макет здесь).

Я также попытался использовать @BindingConversion , но это не сработало (что на самом деле ожидается, но я все равно попытался) – int прежнему был назначен методу заполнителя, и метод привязки не вызывался.

Как я могу явно получить ресурс по своему id в библиотеке DataBinding?

Solutions Collecting From Web of "DataBinding: Как получить ресурс по динамическому идентификатору?"

Другим решением является создание для него настраиваемого @BindingAdapter .

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

А затем просто укажите переменные отдельно.

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

Вы можете использовать массив, если вам нужно несколько аргументов, но в моем случае одного было достаточно.

По состоянию на июнь 2016 года это возможно в XML:

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

В итоге я создал свой собственный метод:

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

Объявление импорта для него:

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

И просто называя это во время привязки:

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

Было бы неплохо иметь готовый метод для этого. DataBinding – это sitll в бета-версии, поэтому, возможно, это произойдет в будущем.