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:
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
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<String, Object>"/>
</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<Object>"/>
</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ı
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken gösterilir
- ViewModel için Kayıtlı Durum modülü
- Düzen görünümlerini Mimari Bileşenlerine bağlama
- Çağrı kitaplığına genel bakış