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;
}
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