İki yönlü veri bağlama

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:

  1. 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;
        }
    }
  2. @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ı