Gözlemlenebilir veri nesneleriyle çalışma

Gözlemlenebilirlik, bir nesnenin verilerindeki değişiklikleri başkalarına bildirme yeteneğini ifade eder. Veri Bağlama Kitaplığı nesneleri, alanları veya koleksiyonları gözlemlenebilir hale getirmenizi sağlar.

Veri bağlama için herhangi bir nesneyi kullanabilirsiniz, ancak nesnenin değiştirilmesi kullanıcı arayüzünün otomatik olarak güncellenmesine neden olmaz. Veri nesnelerinizin, verileri değiştiğinde diğer nesneleri (dinleyici olarak bilinir) bilgilendirmesini sağlamak için veri bağlamayı kullanabilirsiniz. Üç tür gözlemlenebilir sınıf vardır: alanlar, koleksiyonlar ve nesneler.

Bu gözlemlenebilir veri nesnelerinden biri kullanıcı arayüzüne bağlandığında ve veri nesnesinin bir özelliği değiştiğinde, kullanıcı arayüzü otomatik olarak güncellenir.

Gözlemlenebilir alanlar

Sınıflarınızın yalnızca birkaç özelliği varsa Observable arayüzünü uygulayan sınıflar oluşturmaya değmeyebilir. Bu durumda, alanları gözlemlenebilir hale getirmek için genel Observable sınıfını ve aşağıdaki temel özgü sınıfları kullanabilirsiniz:

Gözlemlenebilir alanlar, tek bir alana sahip bağımsız ve gözlemlenebilir nesnelerdir. Temel sürümler, erişim işlemleri sırasında kutulama ve kutu açılımı yapmaktan kaçınır. Bu mekanizmayı kullanmak için aşağıdaki örnekte gösterildiği gibi Java programlama dilinde bir public final özelliği veya Kotlin'de salt okunur bir özellik oluşturun:

Kotlin

class User {
    val firstName = ObservableField<String>()
    val lastName = ObservableField<String>()
    val age = ObservableInt()
}

Java

private static class User {
    public final ObservableField<String> firstName = new ObservableField<>();
    public final ObservableField<String> lastName = new ObservableField<>();
    public final ObservableInt age = new ObservableInt();
}

Alan değerine erişmek için set() ve get() erişimci yöntemlerini veya Kotlin mülk söz dizimi'ni kullanın:

Kotlin

user.firstName = "Google"
val age = user.age

Java

user.firstName.set("Google");
int age = user.age.get();

Gözlemlenebilir koleksiyonlar

Bazı uygulamalar, verileri saklamak için dinamik yapılar kullanır. Gözlemlenebilir koleksiyonlar, bir anahtar kullanılarak bu yapılara erişim sağlar. ObservableArrayMap sınıfı, anahtar aşağıdaki örnekte gösterildiği gibi String gibi bir referans türü olduğunda kullanışlıdır:

Kotlin

ObservableArrayMap<String, Any>().apply {
    put("firstName", "Google")
    put("lastName", "Inc.")
    put("age", 17)
}

Java

ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);

Düzende, aşağıdaki örnekte gösterildiği gibi, dize tuşlarını kullanarak haritayı bulabilirsiniz:

<data>
    <import type="android.databinding.ObservableMap"/>
    <variable name="user" type="ObservableMap&lt;String, Object&gt;"/>
</data>
…
<TextView
    android:text="@{user.lastName}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text="@{String.valueOf(1 + (Integer)user.age)}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

ObservableArrayList sınıfı, anahtar aşağıdaki gibi bir tam sayı olduğunda kullanışlıdır:

Kotlin

ObservableArrayList<Any>().apply {
    add("Google")
    add("Inc.")
    add(17)
}

Java

ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);

Düzende, aşağıdaki örnekte gösterildiği gibi, listeye dizinler aracılığıyla erişebilirsiniz:

<data>
    <import type="android.databinding.ObservableList"/>
    <import type="com.example.my.app.Fields"/>
    <variable name="user" type="ObservableList&lt;Object&gt;"/>
</data>
…
<TextView
    android:text='@{user[Fields.LAST_NAME]}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Gözlemlenebilir nesneler

Observable arayüzünü uygulayan bir sınıf, gözlemlenebilir nesnedeki özellik değişiklikleri hakkında bildirim almak isteyen dinleyicilerin kaydedilmesine olanak tanır.

Observable arayüzünde işleyici ekleme ve kaldırma mekanizması bulunur ancak bildirimlerin ne zaman gönderileceğine siz karar verirsiniz. Veri Bağlama Kitaplığı, geliştirmeyi kolaylaştırmak için işleyici kayıt mekanizmasını uygulayan BaseObservable sınıfını sağlar. Özellikler değiştiğinde bilgi vermek, BaseObservable yöntemini uygulayan veri sınıfının sorumluluğundadır. Bunu yapmak için alıcıya bir Bindable ek açıklaması atayın ve aşağıdaki örnekte gösterildiği gibi setter'da notifyPropertyChanged() yöntemini çağırın:

Kotlin

class User : BaseObservable() {

    @get:Bindable
    var firstName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.firstName)
        }

    @get:Bindable
    var lastName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.lastName)
        }
}

Java

private static class User extends BaseObservable {
    private String firstName;
    private String lastName;

    @Bindable
    public String getFirstName() {
        return this.firstName;
    }

    @Bindable
    public String getLastName() {
        return this.lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(BR.firstName);
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }
}

Veri bağlama, modül paketinde BR adlı bir sınıf oluşturur. Bu sınıf, veri bağlama için kullanılan kaynakların kimliklerini içerir. Bindable ek açıklaması, derleme sırasında BR sınıf dosyasında bir giriş oluşturur. Veri sınıflarının temel sınıfı değiştirilemiyorsa işleyicileri etkili bir şekilde kaydetmek ve bilgilendirmek için bir PropertyChangeRegistry nesnesi kullanarak Observable arayüzünü uygulayabilirsiniz.

Yaşam döngüsünü algılayan nesneler

Uygulamanızdaki düzenler, verilerdeki değişiklikler hakkında kullanıcı arayüzünü otomatik olarak bilgilendiren veri bağlama kaynaklarına da bağlanabilir. Bu şekilde, bağlamalarınız yaşam döngüsünü algılar ve yalnızca kullanıcı arayüzü ekranda göründüğünde tetiklenir.

Veri bağlama özelliği, StateFlow ve LiveData özelliklerini destekler. Veri bağlamada LiveData kullanma hakkında daha fazla bilgi için Kullanıcı arayüzünü veri değişiklikleri hakkında bilgilendirmek için LiveData'yı kullanma konusuna bakın.

StateFlow'u kullan

Uygulamanız eş yordamlarla birlikte Kotlin kullanıyorsa veri bağlama kaynağı olarak StateFlow nesnelerini kullanabilirsiniz. Bağlama sınıfınızla bir StateFlow nesnesi kullanmak için StateFlow nesnesinin kapsamını tanımlayacak bir yaşam döngüsü sahibi belirtin. Aşağıdaki örnekte, bağlama sınıfı örneklendikten sonra yaşam döngüsü sahibi olarak etkinlik belirtilir:

class ViewModelActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // Inflate view and obtain an instance of the binding class.
        val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user)

        // Specify the current activity as the lifecycle owner.
        binding.lifecycleOwner = this
    }
}

Düzen görünümlerini Mimari Bileşenlerine bağlama bölümünde açıklandığı gibi, veri bağlama ViewModel nesneleriyle sorunsuz şekilde çalışır. StateFlow ve ViewModel öğelerini aşağıdaki şekilde birlikte kullanabilirsiniz:

class ScheduleViewModel : ViewModel() {

    private val _username = MutableStateFlow<String>("")
    val username: StateFlow<String> = _username

    init {
        viewModelScope.launch {
            _username.value = Repository.loadUserName()
        }
    }
}

Aşağıdaki örnekte gösterildiği gibi, düzeninizde ViewModel nesnenizin özelliklerini ve yöntemlerini bağlama ifadeleri kullanarak ilgili görünümlere atayın:

<TextView
    android:id="@+id/name"
    android:text="@{viewmodel.username}" />

Kullanıcının ad değeri değiştiğinde kullanıcı arayüzü otomatik olarak güncellenir.

StateFlow desteğini devre dışı bırak

Kotlin ve AndroidX kullanan uygulamalarda StateFlow desteği, veri bağlamaya otomatik olarak dahildir. Bu, bağımlılığın halihazırda mevcut olmadığı durumlarda eş zamanlı bağımlılığın uygulamanıza otomatik olarak dahil edileceği anlamına gelir.

build.gradle dosyanıza aşağıdakileri ekleyerek bu işlevi devre dışı bırakabilirsiniz:

Modern

android {
    ...
    dataBinding {
        addKtx = false
    }
}

Kotlin

android {
    ...
    dataBinding {
        addKtx = false
    }
}

Alternatif olarak, aşağıdaki satırı gradle.properties dosyasına ekleyerek StateFlow öğesini projenizde genel olarak devre dışı bırakabilirsiniz:

Modern

android.defaults.databinding.addKtx = false

Kotlin

android.defaults.databinding.addKtx = false

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ı