0

Je me suis créé une classe simple pour valider des champs grâce à la liaison de données bidirectionnelle.Liaison de données bidirectionnelle d'objets personnalisés android: text

public class ValidatedField extends BaseObservable{ 
      private String mValue; 

      @Bindable 
      public String getValue() 
      { 
       return mValue; 
      } 


      public void setValue(String value) 
      { 
       if(Objects.equals(value, mValue)) return; 

       mValue = value; 
       notifyPropertyChanged(BR.value); 
      } 
    ... 
} 

Dans la configuration ViewModel je cette classe et le lier à voir comme d'habitude dans databinding (toutes liant fonctionne réellement si aucune erreur ici).

public ValidatedField phoneNumber = new ValidatedField(); 

Dans la mise en page, j'ai vue avec Android: propriété de texte et configuration I:

<EditText 
    android:text="@={viewModel.phoneNumber.value}" 
/> 

Et tout fonctionne comme un charme.

Et ma question est: est-il possible de sauter « .value » de la mise en page pour qu'il ressemble à ceci:

<EditText 
    android:text="@={viewModel.phoneNumber}" 
/> 

je pourrais le faire fonctionner si elle était d'une manière contraignante par exemple par la conversion de liaison comme ceci:

@BindingConversion 
public static String convertValidatedFieldToString(ValidatedField field){ 
    return field.getValue(); 
} 

Mais je ne suis pas en mesure de définir une nouvelle valeur à ValidatedField existant. J'ai essayé d'utiliser @InverseBindingAdapter mais cela n'a pas de chance car cela créerait à chaque fois un nouvel objet et pas seulement une valeur mise à jour d'un existant.

@InverseBindingAdapter(attribute = "android:text") 
public static ValidatedField convertStringToValidatedField(TextView view) 
{ 
    return new ValidatedField(view.getText().toString()); 
} 

Merci!


Edit: J'aurais dit que j'ai d'autres domaines @Bindable dans la classe. par exemple:

@Bindable 
public boolean getIsError() 
{ 
    return mIsError; 
} 

Répondre

0

Il me semble que vous auriez pu étendre juste ObservableField<String> puis remplacer la méthode set. donc comme:

public class ValidatedField extends ObservableField<String> { 
    @Override 
    public void set(String value) { 
     if (get().equals(value)) 
      return; 
     super.set(value); 
    } 
} 
+0

Cela fonctionnerait mais seulement s'il n'y a pas d'autres champs Bindable dans la classe. Si je voulais vérifier par exemple phoneNumber.isError pour l'accesseur Bindable public boolean getIsError() {return mIsError; } il dit que Erreur: Impossible de trouver l'accesseur java.lang.String.error – mlyko

0

DataBindings est un manque InverseBindingConversion. Pour l'instant, cela ne fonctionne pas comme si vous aviez l'intention de l'utiliser.

Vous devez donc écrire @={viewModel.phoneNumber.value} à tout moment.