Gözlemlenebilir veri nesneleriyle çalışma

Gözlemlenebilirlik, bir nesnenin başkalarını dönüşüm artışı elde etti. Veri Bağlama Kitaplığı, nesne, alan veya gözlemlenebilir koleksiyonlar.

Veri bağlama için istediğiniz nesneyi kullanabilirsiniz, ancak nesnenin değiştirilmesi kullanıcı arayüzünün güncellenmesine otomatik olarak neden olur. Verilerinizi vermek için veri bağlamayı kullanabilirsiniz diğer nesneleri (buna dinleyici olarak bilinirler) en iyi yöntemin ne olduğunu öğreneceğiz. Üç tür gözlemlenebilir sınıf vardır: alanlar, koleksiyonlar ve nesneler.

Bu gözlemlenebilir veri nesnelerinden biri kullanıcı arayüzüne ve kullanıcı arayüzü otomatik olarak güncellenir.

Gözlemlenebilir alanlar

Sınıflarınızda sadece birkaç tesis varsa bu özellikler şunu uygulayan sınıflar oluştur: Observable arayüzü. Burada durumda, genel Observable sınıfını ve aşağıdaki alanları gözlemlenebilir hale getirmek için temele özgü sınıflar:

Gözlemlenebilir alanlar, kendi içinde tek bir girin. İlkel sürümler erişim sırasında boks ve kutu açılımı yapmaktan kaçınır anlamına gelir. Bu mekanizmayı kullanmak için Java'da bir public final özelliği oluşturun. aşağıda gösterildiği gibi, Kotlin biçiminde bir salt okunur özellik) şu örneği inceleyin:

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öntemi veya Kotlin mülkünü kullanın söz dizimi:

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 bu yapılara erişmek için bir anahtar kullanmanız gerekir. İlgili içeriği oluşturmak için kullanılan ObservableArrayMap sınıf anahtarın, String şu örneği inceleyin:

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, dize tuşlarını kullanarak haritayı bulmak için şu örneği inceleyin:

<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ğıda gösterildiği 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, listeye şu örneği inceleyin:

<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, aşağıdakilerin kaydedilmesine olanak tanır: gözlemlenebilir mülkteki mülk değişiklikleri hakkında bildirim almak isteyen dinleyiciler nesnesini tanımlayın.

Observable arayüzünde, işleyici ekleyip kaldıran bir mekanizma vardır, ancak bildirimlerin ne zaman gönderileceğine karar verir. Veri, geliştirmeyi kolaylaştırmak amacıyla Bağlama Kitaplığı BaseObservable sınıfı, hangi dinleyici kayıt mekanizmasını uygular. Ölçüm işlemini gerçekleştiren veri sınıfı Özellikler değiştiğinde bildirim göndermekten BaseObservable sorumludur. Yapılacaklar Bunun için bir Bindable ek açıklaması atayın alıcısına ilettiğim notifyPropertyChanged() yöntemini kullanı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 adında bir sınıf oluşturur. Bu sınıf, şunları içerir: veri bağlama için kullanılan kaynakların kimlikleri. Bindable ek açıklaması derleme sırasında BR sınıf dosyasında bir giriş oluşturur. Temel sınıf değiştirilemez, Observable arayüzünü uygulayabilirsiniz profesyonel ve rahatlatıcı PropertyChangeRegistry yardımcı olacak bir nesnedir.

Yaşam döngüsüne duyarlı nesneler

Uygulamanızdaki düzenler, otomatik olarak bağlantı kuran kullanıcı arayüzünü verilerdeki değişikliklerle ilgili bilgilendirme. Bu şekilde, bağlamalarınız yaşam döngüsüne duyarlıdır ve yalnızca kullanıcı arayüzü ekranda göründüğünde tetiklenir.

Veri bağlama destekler StateFlow ve LiveData. Daha fazla bilgi için LiveData kullanarak veri bağlamada kullanımı hakkında daha fazla bilgi için Kullanıcı arayüzünü veriler hakkında bilgilendirmek için LiveData'yı kullanma değişiklikler başlıklı makaleye göz atın.

StateFlow'u kullanma

Uygulamanızda Kotlin'i eş yordamlar ile birlikte kullanıyorsa Veri bağlama kaynağı olarak StateFlow nesne kullanılacak. Bir StateFlow nesnesini şununla kullanmak için: bağlamanın kapsamını tanımlamak için bir yaşam döngüsü sahibi belirtin StateFlow nesne algılandı. Aşağıdaki örnekte, etkinliği yaşam döngüsü sahibi:

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 Mimariye bağlama konusunda açıklandığı gibi Bileşenler, veri bağlama ViewModel ile sorunsuz şekilde çalışır nesneler'i tıklayın. 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()
        }
    }
}

Düzeninizde ViewModel nesnenizin özelliklerini ve yöntemlerini aşağıdaki gösterildiği gibi, bağlama ifadeleri kullanan karşılık gelen görünümler örnek:

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

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

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

Kotlin ve AndroidX kullanan uygulamalar için StateFlow desteği otomatik olarak dahil edilir. Bu, eş yordamların bağımlılığının halihazırda mevcut değilse uygulamanıza otomatik olarak eklenir.

Bu işlevi devre dışı bırakmak için build.gradle dosyası:

Eski

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

Kotlin

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

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

Eski

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 göz atın:

Örnekler

Codelab'ler

Blog yayınları

ziyaret edin.