En utilisant la liaison de données unidirectionnelle, vous pouvez définir une valeur pour un attribut qui réagit à une modification de cet attribut:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@{viewmodel.rememberMe}" android:onCheckedChanged="@{viewmodel.rememberMeChanged}" />
La liaison de données bidirectionnelle fournit un raccourci vers ce processus:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@={viewmodel.rememberMe}" />
La notation @={}
, qui inclut surtout le caractère "=" reçoit des données
les modifications apportées à la propriété et écouter
les mises à jour des utilisateurs en même temps.
Afin de réagir aux modifications apportées aux données de sauvegarde, vous pouvez faire en sorte que votre mise en page
une implémentation de Observable
, généralement
BaseObservable
, et utilisez un
l'annotation @Bindable
, comme indiqué dans
l'extrait de code suivant:
Kotlin
class LoginViewModel : BaseObservable { // val data = ... @Bindable fun getRememberMe(): Boolean { return data.rememberMe } fun setRememberMe(value: Boolean) { // Avoids infinite loops. if (data.rememberMe != value) { data.rememberMe = value // React to the change. saveData() // Notify observers of a new value. notifyPropertyChanged(BR.remember_me) } } }
Java
public class LoginViewModel extends BaseObservable { // private Model data = ... @Bindable public Boolean getRememberMe() { return data.rememberMe; } public void setRememberMe(Boolean value) { // Avoids infinite loops. if (data.rememberMe != value) { data.rememberMe = value; // React to the change. saveData(); // Notify observers of a new value. notifyPropertyChanged(BR.remember_me); } } }
Étant donné que la méthode getter de la propriété pouvant être liée est appelée getRememberMe()
,
la méthode setter correspondante de la propriété utilise automatiquement le nom
setRememberMe()
Pour en savoir plus sur l'utilisation de BaseObservable
et de @Bindable
, consultez la page Utiliser des
objets de données observables.
Liaison de données bidirectionnelle à l'aide d'attributs personnalisés
La plate-forme fournit des implémentations de liaison de données bidirectionnelles pour les cas d'utilisation les plus courants
des attributs bidirectionnels et de modifier les écouteurs, que vous pouvez utiliser
dans votre application. Si vous souhaitez utiliser une liaison de données bidirectionnelle avec des
, vous devez utiliser les attributs
@InverseBindingAdapter
et
@InverseBindingMethod
.
Par exemple, si vous souhaitez activer la liaison de données bidirectionnelle sur un attribut "time"
Dans une vue personnalisée appelée MyView
, procédez comme suit:
Annotez la méthode qui définit la valeur initiale et se met à jour lorsque la valeur des modifications à l'aide de
@BindingAdapter
:Kotlin
@BindingAdapter("time") @JvmStatic fun setTime(view: MyView, newValue: Time) { // Important to break potential infinite loops. if (view.time != newValue) { view.time = newValue } }
Java
@BindingAdapter("time") public static void setTime(MyView view, Time newValue) { // Important to break potential infinite loops. if (view.time != newValue) { view.time = newValue; } }
Annotez la méthode qui lit la valeur à partir de la vue en utilisant
@InverseBindingAdapter
:Kotlin
@InverseBindingAdapter("time") @JvmStatic fun getTime(view: MyView) : Time { return view.getTime() }
Java
@InverseBindingAdapter("time") public static Time getTime(MyView view) { return view.getTime(); }
À ce stade, la liaison de données sait quoi faire lorsque les données changent (elle appelle la méthode
annotée avec
@BindingAdapter
) et les éléments à
lorsque l'attribut "view" est modifié (il appelle la méthode
InverseBindingListener
).
Toutefois, il ne sait pas quand ni comment l'attribut change.
Pour cela, vous devez définir un écouteur sur la vue. Il peut s'agir d'un écouteur personnalisé
associé à votre vue personnalisée, ou il peut s'agir d'un événement générique, comme une perte
ou un changement de texte. Ajouter l'annotation @BindingAdapter
à la méthode
qui définit l'écouteur des modifications apportées à la propriété:
Kotlin
@BindingAdapter("app:timeAttrChanged") @JvmStatic fun setListeners( view: MyView, attrChange: InverseBindingListener ) { // Set a listener for click, focus, touch, etc. }
Java
@BindingAdapter("app:timeAttrChanged") public static void setListeners( MyView view, final InverseBindingListener attrChange) { // Set a listener for click, focus, touch, etc. }
L'écouteur inclut un InverseBindingListener
en tant que paramètre. Utilisez les
InverseBindingListener
pour indiquer au système de liaison de données que l'attribut a
modifié. Le système peut alors commencer à appeler la méthode annotée
@InverseBindingAdapter
, etc.
En pratique, cet écouteur inclut une logique non triviale, y compris des écouteurs
pour la liaison de données à sens unique. Pour obtenir un exemple, consultez l'adaptateur pour l'attribut texte.
modifier,
TextViewBindingAdapter
Visiteurs ayant déjà réalisé une conversion
Si la variable associée à un objet View
doivent être formatés, traduits ou modifiés
avant d'être affichés,
vous pouvez utiliser un objet Converter
.
Prenons l'exemple d'un objet EditText
qui affiche une date:
<EditText
android:id="@+id/birth_date"
android:text="@={Converter.dateToString(viewmodel.birthDate)}"
/>
L'attribut viewmodel.birthDate
contient une valeur de type Long
. Il doit donc
à l'aide d'un convertisseur.
Étant donné qu'une expression bidirectionnelle est utilisée, une valeur inverse doit également être définie.
convertisseur pour indiquer à la bibliothèque comment reconvertir la chaîne fournie par l'utilisateur.
au type de données de sauvegarde, dans ce cas Long
. Ce processus se fait
en ajoutant
l'annotation @InverseMethod
;
à l'un des convertisseurs et que cette annotation fasse référence à l'inverse
. Un exemple de cette configuration apparaît dans le code suivant :
snippet:
Kotlin
object Converter { @InverseMethod("stringToDate") @JvmStatic fun dateToString( view: EditText, oldValue: Long, value: Long ): String { // Converts long to String. } @JvmStatic fun stringToDate( view: EditText, oldValue: String, value: String ): Long { // Converts String to long. } }
Java
public class Converter { @InverseMethod("stringToDate") public static String dateToString(EditText view, long oldValue, long value) { // Converts long to String. } public static long stringToDate(EditText view, String oldValue, String value) { // Converts String to long. } }
Boucles infinies avec une liaison de données bidirectionnelle
Veillez à ne pas introduire de boucles infinies lorsque vous utilisez la liaison de données bidirectionnelle. Quand ?
l'utilisateur modifie un attribut, la méthode annotée
@InverseBindingAdapter
est appelé et la valeur est attribuée au stockage
. Cela, à son tour, appellerait la méthode annotée avec
@BindingAdapter
, ce qui déclenche un autre appel à la méthode annotée
à l'aide de @InverseBindingAdapter
, etc.
Pour cette raison, il est important de briser d'éventuelles boucles infinies en comparant
nouvelles et anciennes valeurs dans les méthodes annotées à l'aide de @BindingAdapter
.
Attributs à double sens
La plate-forme prend en charge la liaison de données bidirectionnelle lorsque vous utilisez les attributs présentés dans le tableau suivant. Pour savoir comment la plate-forme fournit cette compatibilité, consultez les implémentations des adaptateurs de liaison correspondants:
Classe | Attribut(s) | Adaptateur de liaison |
---|---|---|
AdapterView
|
android:selectedItemPosition android:selection |
AdapterViewBindingAdapter
|
CalendarView |
android:date |
CalendarViewBindingAdapter
|
CompoundButton |
android:checked
|
CompoundButtonBindingAdapter
|
DatePicker
|
android:year android:month android:day |
DatePickerBindingAdapter
|
NumberPicker |
android:value
|
NumberPickerBindingAdapter
|
RadioButton
|
android:checkedButton |
RadioGroupBindingAdapter
|
RatingBar
|
android:rating
|
RatingBarBindingAdapter
|
SeekBar
|
android:progress |
SeekBarBindingAdapter
|
TabHost
|
android:currentTab |
TabHostBindingAdapter
|
TextView
|
android:text
|
TextViewBindingAdapter
|
TimePicker
|
android:hour android:minute |
TimePickerBindingAdapter
|
Ressources supplémentaires
Pour en savoir plus sur la liaison de données, consultez des ressources supplémentaires.
Exemples
Ateliers de programmation
- <ph type="x-smartling-placeholder"></ph> Atelier de programmation sur la liaison de données Android
Articles de blog
Recommandations personnalisées
- Remarque : Le texte du lien s'affiche lorsque JavaScript est désactivé
- Utiliser les objets de données observables
- Dispositions et expressions de liaison
- Lier des vues de disposition aux composants d'architecture