Couru dans un problème mystérieux en essayant de faire un @BindingConversion pour int to string.
Le code suivant fonctionne pour les floats aux chaînes :
xml:
...
<variable
name="myViewModel"
type="... .SomeModel" />
...
<TextView
style="@style/StyleStuff"
Android:text="@{myViewModel.number}" />
code:
public class SomeModel {
public ObservableFloat number = new ObservableFloat();
}
et mise en place:
viewModel.number.set(3.14f);
Mais si j'essaie la même chose pour ints to strings je reçois un crash.
public ObservableInt number = new ObservableInt();
avec
viewModel.number.set(42);
Je reçois ce qui suit:
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)
Des idées? Merci!
Android:text
avec int
suppose que int
est un ID de ressource de chaîne. Utilisez Android:text="@{Integer.toString(myViewModel.number)}"
.
Vous devrez également importer la classe Integer
:
<layout>
<data>
<import type="Java.lang.Integer" />
</data>
<!-- rest of layout goes here -->
</layout>
Convertissez int en chaîne pour définir dans TextView comme ci-dessous:
Android:text="@{String.valueOf(myViewModel.number)}"
De plus, la classe String
doit être importée par la présentation:
<layout>
<data>
<import type="Java.lang.String" />
</data>
…
</layout>
Android:text="@{`` + model.intValue}"
Ceci peut également être utilisé dans une liaison bidirectionnelle pour EditText
. L'entrée des utilisateurs est définie sur la valeur Integer du modèle et affichée sous la forme String
.
Android:text="@={`` + model.intValue}"
Voir cette réponse aussi.
Cela a fonctionné pour moi
<TextView
Android:id="@+id/number"
Android:text='@={Converter.convertIntToString(myViewModel.number)}'
/>
Classe de conversion avec méthode inverse
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);
}}