Ответ 1
android:text
с int
предполагает, что int
является идентификатором строкового ресурса. Используйте android:text="@{Integer.toString(myViewModel.number)}"
.
Вам также нужно будет импортировать класс (больше не нужен)Integer
:
Впадает в загадочную проблему при попытке сделать @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)
Любые идеи? Спасибо!
android:text
с int
предполагает, что int
является идентификатором строкового ресурса. Используйте android:text="@{Integer.toString(myViewModel.number)}"
.
Вам также нужно будет импортировать класс (больше не нужен)Integer
:
Преобразуйте int в строку для набора в TextView, как показано ниже:
android:text="@{String.valueOf(myViewModel.number)}"
Кроме того, класс String
должен быть импортирован макетом:
<layout>
<data>
<import type="java.lang.String" />
</data>
…
</layout>
Осторожно, в последней 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)}"
непосредственно.
android:text="@{'' + model.intValue}"
Это также может быть использовано в двустороннем связывании для EditText
. Где пользовательский ввод установлен как целочисленное значение в модели и показан как String
.
android:text="@={'' + model.intValue}"
Смотрите также этот ответ.
Это сработало для меня
<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);
}}