web-dev-qa-db-fra.com

Échec de la liaison des données Android @BindingConversion pour int à string

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!

24
Dave

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>
88
CommonsWare

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>
9
Marjan Dn

La solution la plus simple, peut-être que cela aiderait quelqu'un.

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.

3
Khemraj

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);
}}
0
coffeeshots