Tek yönlü veri bağlamayı kullanarak bir özellikte bir değer ayarlayabilir ve bu özellikteki değişikliklere tepki verecek bir işleyici ayarlayabilirsiniz:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@{viewmodel.rememberMe}" android:onCheckedChanged="@{viewmodel.rememberMeChanged}" />
İki yönlü veri bağlama işlemi bu işlemin kısayolunu sağlar:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@={viewmodel.rememberMe}" />
Önemli olarak "=" işaretini içeren @={}
gösterimi, mülkteki veri değişikliklerini alır ve aynı zamanda kullanıcı güncellemelerini izler.
Destek verilerindeki değişikliklere tepki vermek için, düzen değişkeninizi Observable
(genellikle BaseObservable
) uygulaması haline getirebilir ve aşağıdaki kod snippet'inde gösterildiği gibi bir @Bindable
ek açıklaması kullanabilirsiniz:
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); } } }
Bağlanabilir mülkün alıcı yöntemi getRememberMe()
olarak adlandırıldığı için, mülkün ilgili setter yöntemi otomatik olarak setRememberMe()
adını kullanır.
BaseObservable
ve @Bindable
kullanımı hakkında daha fazla bilgi için Gözlemlenebilir veri nesneleriyle çalışma bölümüne bakın.
Özel özellikleri kullanarak iki yönlü veri bağlama
Platform, en yaygın iki yönlü özellikler ve değişiklik işleyiciler için iki yönlü veri bağlama uygulamaları sağlar. Bunları uygulamanızın bir parçası olarak kullanabilirsiniz. Özel özelliklerle iki yönlü veri bağlama kullanmak istiyorsanız @InverseBindingAdapter
ve @InverseBindingMethod
ek açıklamalarıyla çalışmanız gerekir.
Örneğin, MyView
adlı özel görünümde bir "time"
özelliğinde iki yönlü veri bağlamayı etkinleştirmek istiyorsanız aşağıdaki adımları tamamlayın:
Başlangıç değerini belirleyen yönteme ek açıklama ekleyin ve değer değiştiğinde güncelleme için
@BindingAdapter
yöntemini kullanın: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; } }
@InverseBindingAdapter
kullanarak değeri görünümden okuyan yönteme ek açıklama ekleyin:Kotlin
@InverseBindingAdapter("time") @JvmStatic fun getTime(view: MyView) : Time { return view.getTime() }
Java
@InverseBindingAdapter("time") public static Time getTime(MyView view) { return view.getTime(); }
Bu noktada veri bağlama, veriler değiştiğinde ne yapılacağını (@BindingAdapter
ek açıklaması eklenmiş yöntemi çağırır) ve görünüm özelliği değiştiğinde ne çağrılacağını (InverseBindingListener
çağırır) bilir.
Ancak özelliğin ne zaman veya nasıl değiştiğini bilemez.
Bunun için görünümde bir dinleyici ayarlamanız gerekir. Bu, özel görünümünüzle ilişkilendirilmiş özel bir işleyici olabileceği gibi odak kaybı veya metin değişikliği gibi genel bir etkinlik de olabilir. @BindingAdapter
ek açıklamasını, özellikteki değişiklikler için işleyiciyi ayarlayan yönteme ekleyin:
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. }
İşleyici, parametre olarak bir InverseBindingListener
ekler. Veri bağlama sistemine özelliğin değiştiğini bildirmek için InverseBindingListener
özelliğini kullanırsınız. Daha sonra sistem, @InverseBindingAdapter
kullanarak ek açıklama eklenen yöntemi çağırmaya başlayabilir.
Pratikte bu işleyici, tek yönlü veri bağlama işlemi için işleyiciler dahil olmak üzere sıra dışı bazı mantıklar içerir. Örnek için, TextViewBindingAdapter
metin özelliği değişikliğinin bağdaştırıcısına bakın.
Dönüşüm sağlayan kullanıcı sayısı
View
nesnesine bağlı değişkenin görüntülenmeden önce biçimlendirilmesi, çevrilmesi veya bir şekilde değiştirilmesi gerekiyorsa Converter
nesnesi kullanılabilir.
Örneğin, tarih gösteren bir EditText
nesnesini ele alalım:
<EditText
android:id="@+id/birth_date"
android:text="@={Converter.dateToString(viewmodel.birthDate)}"
/>
viewmodel.birthDate
özelliği, Long
türünde bir değer içerdiği için bir dönüştürücü kullanılarak biçimlendirilmesi gerekir.
İki yönlü bir ifade kullanıldığından, kitaplığın kullanıcı tarafından sağlanan dizeyi yedek veri türüne nasıl geri dönüştüreceğini bildirmek için bir ters dönüştürücü de gerekir (bu örnekte Long
). Bu işlem, @InverseMethod
ek açıklaması dönüştürücülerden birine eklenerek ve bu ek açıklamanın ters dönüştürücüye referans vermesini sağlayarak gerçekleştirilir. Bu yapılandırmanın bir örneği aşağıdaki kod snippet'inde görünür:
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. } }
İki yönlü veri bağlamayı kullanan sonsuz döngüler
İki yönlü veri bağlama kullanırken sonsuz döngü yapmamaya dikkat edin. Kullanıcı bir özelliği değiştirdiğinde, @InverseBindingAdapter
kullanılarak ek açıklama eklenen yöntem çağrılır ve değer, destekleyen özelliğe atanır. Bu durumda yöntem @BindingAdapter
kullanılarak ek açıklama eklenmiş olarak çağrılır. Bu yöntem, @InverseBindingAdapter
kullanılarak ek açıklama eklenen yönteme başka bir çağrıyı tetikler.
Bu nedenle, @BindingAdapter
kullanılarak açıklama eklenen yöntemlerde yeni ve eski değerleri karşılaştırarak olası sonsuz döngüleri kırmak önemlidir.
İki yönlü özellikler
Aşağıdaki tabloda yer alan özellikleri kullandığınızda platform, iki yönlü veri bağlama için yerleşik destek sağlar. Platformun bu desteği nasıl sağladığıyla ilgili ayrıntılar için ilgili bağlama bağdaştırıcılarının uygulamalarını inceleyin:
Sınıf | Özellikler | Adaptör bağlama |
---|---|---|
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
|
Ek kaynaklar
Veri bağlama hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.
Sana Özel
Codelab uygulamaları
Blog yayınları
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken gösterilir
- Gözlemlenebilir veri nesneleriyle çalışma
- Düzenler ve bağlama ifadeleri
- Düzen görünümlerini Mimari Bileşenlerine bağlama