İki yönlü veri bağlama

Tek yönlü veri bağlamayı kullanarak bir özellik için değer ayarlayabilir ve tepki veren bir dinleyici olarak nitelendirilirler:

<CheckBox
    android:id="@+id/rememberMeCheckBox"
    android:checked="@{viewmodel.rememberMe}"
    android:onCheckedChanged="@{viewmodel.rememberMeChanged}"
/>

İki yönlü veri bağlama bu işlemin kısayolunu sağlar:

<CheckBox
    android:id="@+id/rememberMeCheckBox"
    android:checked="@={viewmodel.rememberMe}"
/>

Önemli bir özelliği "=" içeren @={} gösterimi işareti, veri alır ve kullanıcı güncellemelerini aynı anda dinleyebilirsiniz.

Yedek verilerdeki değişikliklere tepki vermek amacıyla düzeninizi değişken bir Observable uygulaması vardır, genellikle BaseObservable ve Aşağıdaki şekilde gösterildiği gibi @Bindable ek açıklaması şu kod snippet'ini 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ığından ilgili setter yöntemi, adı otomatik olarak kullanır. setRememberMe().

BaseObservable ve @Bindable özelliklerini kullanma hakkında daha fazla bilgi için Şunlarla çalışma: gözlemlenebilir veri nesnelerini inceleyin.

Özel özellikler kullanarak çift yönlü veri bağlama

Platform, en yaygın veriler için iki yönlü veri bağlama iki yönlü özellikler ve değişiklik dinleyicileri gibi uygulamanızın bir parçası olarak kullanın. Özel yapılandırma ile iki yönlü veri bağlamayı kullanmak istiyorsanız özellikleri kullanmak için @InverseBindingAdapter ve @InverseBindingMethod ek açıklamalar.

Örneğin, bir "time" özelliğinde iki yönlü veri bağlamayı etkinleştirmek isterseniz MyView adlı özel görünümde aşağıdaki adımları tamamlayın:

  1. İlk değeri belirleyen ve değer olduğunda güncelleyen yöntemi ek açıklama olarak belirtin. @BindingAdapter kullanılarak yapılan değişiklikler:

    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;
        }
    }
  2. Görünümdeki değeri okuyan yönteme ek açıklama eklemek için @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();
    }

Bu noktada, veri bağlama, veriler değiştiğinde ne yapılacağını bilir ( yönteminde belirtildiği şekilde @BindingAdapter) ve yapmanız gerekenler çağrısına bağlı olarak, görünüm özelliği değiştiğinde ( InverseBindingListener). Ancak, özelliğin ne zaman ve nasıl değiştiğini bilmez.

Bunun için görünümde bir dinleyici ayarlamanız gerekir. Bu özel bir işleyici olabilir olabilir ya da bir kayıp gibi genel bir etkinlik olabilir değişiklik gösterebilir. @BindingAdapter ek açıklamasını yönteme ekleyin işleyiciyi mülkteki değişiklikler için ayarlar:

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. Önce InverseBindingListener (veri bağlama sistemine özelliğin olduğunu bildirir) değiştirildi. Daha sonra sistem, @InverseBindingAdapter vb.

Pratikte bu dinleyici, dinleyenler de dahil olmak üzere bazı önemsiz mantıksal unsurlara da yer verir. tek yönlü veri bağlama için kullanılabilir. Örneğin, metin özelliğinin bağdaştırıcısına bakın değişiklik, TextViewBindingAdapter.

Dönüşüm sağlayan kullanıcı sayısı

View nesnesine bağlı değişken görüntülenmeden önce biçimlendirilmesi, çevrilmesi veya değiştirilmesi gerektiğini unutmayın. Converter nesnesi kullanılabilir.

Örneğin, tarih gösteren bir EditText nesnesini alın:

<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 biçimlendirilmesi için gereklidir.

İki yönlü bir ifade kullanıldığından, aynı zamanda ters dönüştürücü kullanın. yedek veri türüne (bu örnekte Long) ekle. Bu işlem, @InverseMethod ek açıklaması dönüşümü sağlayanlardan birine göndermeli ve bu ek açıklamanın dönüştürücü. Bu yapılandırmanın bir örneği aşağıdaki kodda gösterilmiştir 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.
    }
}

İki yönlü veri bağlama kullanan sonsuz döngüler

İki yönlü veri bağlama kullanırken sonsuz döngüler oluşturmamaya dikkat edin. Zaman kullanıcı bir özelliği değiştirdiğinde @InverseBindingAdapter çağrılır ve değer, yedeklemeye atanır. Böylece, @BindingAdapter; bu, açıklama eklenen yönteme yönelik başka bir çağrıyı tetikler @InverseBindingAdapter vb. kullanarak.

Bu nedenle, zaman çizelgesine uyabilmeniz için @BindingAdapter kullanılarak ek açıklama eklenen yöntemlerdeki yeni ve eski değerler.

İki yönlü özellikler

Platform, şunları kullandığınızda iki yönlü veri bağlama için yerleşik destek sağlar: özellikleri kullanın. Platformun sunduğu imkanlarla ilgili ilgili bağlama bağdaştırıcılarının uygulamalarına bakın:

Sınıf Özellikler Bağlama adaptörü
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 için aşağıdakilere bakın ek kaynaklar.

Örnekler

Codelab'ler

Blog yayınları

ziyaret edin. ziyaret edin.