Android Data Binding @bindingconversion failure for int to string


Столкнулся с загадочной проблемой при попытке сделать @BindingConversion для int в строку.
Следующий код работает для плавающих строк :

Xml:

...
<variable
        name="myViewModel"
        type="... .SomeModel" />
...
<TextView
            style="@style/StyleStuff"
            android:text="@{myViewModel.number}" />

Код:

public class SomeModel {
    public ObservableFloat number = new ObservableFloat();
}

И установка:

viewModel.number.set(3.14f);

Но если я попробую то же самое для ints к строкам, я получу сбой.
 public ObservableInt number = new ObservableInt();

С

viewModel.number.set(42);

Я получаю следующее:

FATAL EXCEPTION: main
Process: ...myapplication, PID: 14311
android.content.res.Resources$NotFoundException: String resource ID #0xfa0
    at android.content.res.Resources.getText(Resources.java:1123)
    at android.support.v7.widget.ResourcesWrapper.getText(ResourcesWrapper.java:52)
    at android.widget.TextView.setText(TextView.java:4816)
    at ...executeBindings(ActivityAdaptersBinding.java:336)
    at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:355)

Есть идеи? Спасибо!

3 23

3 ответа:

android:text с помощью int предполагается, что int является строковым идентификатором ресурса. Используйте android:text="@{Integer.toString(myViewModel.number)}".

Вам также потребуется импортировать класс Integer:

<layout>
   <data>
      <import type="java.lang.Integer" />
   </data>

   <!-- rest of layout goes here -->

</layout>

Преобразовать int в строку для набора в TextView, как показано ниже:

android:text="@{String.valueOf(myViewModel.number)}"

Кроме того, класс String должен быть импортирован макетом:

<layout>
   <data>
      <import type="java.lang.String" />
   </data>

   …

</layout>

Самое простое решение, может быть, это кому-то поможет.

android:text="@{`` + model.number}"

Это также может быть использовано в двусторонней привязке для EditText. смотрите этот вопрос.