Подтвердить что ты не робот

Android Data Binding @BindingConversion для int для строки

Впадает в загадочную проблему при попытке сделать @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)

Любые идеи? Спасибо!

4b9b3361

Ответ 1

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

Вам также нужно будет импортировать класс Integer : (больше не нужен)

Ответ 2

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

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

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

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

   …

</layout>

Ответ 3

Осторожно, в последней DataBinding (2019), она НЕ требует импорта Integer или String иначе вы получите эту ошибку:

****/ data binding error ****msg:Missing import expression although it is registered file

Официальный документ говорит: java.lang.* is imported automatically.

Просто иди

android:text="@{Integer.toString(myViewModel.number)}" или

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

непосредственно.

Ответ 4

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

android:text="@{'' + model.intValue}"

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

android:text="@={'' + model.intValue}"

Смотрите также этот ответ.

Ответ 5

Это сработало для меня

  <TextView
        android:id="@+id/number"
        android:text='@={Converter.convertIntToString(myViewModel.number)}'

        />

Класс конвертера с обратным методом

public class Converter {


public static int convertStringToInt(String text) {
   return Integer.parseInt(text);
}

@InverseMethod(value="convertStringToInt")
public static String convertIntToString(int value) {
    return Integer.toString(value);
}}