Veri Bağlama Kitaplığı, düzenin değişkenlerine ve görünümlerine erişmek için kullanabileceğiniz bağlama sınıfları oluşturur. Bu dokümanda, oluşturulan bağlama sınıflarının nasıl oluşturulacağı ve özelleştirileceği gösterilmektedir.
Oluşturulan bağlama sınıfı, düzen değişkenlerini düzen içindeki görünümlere bağlar. Bağlantının adını ve paketini özelleştirebilirsiniz. Oluşturulan tüm bağlama sınıfları, ViewDataBinding
sınıfından devralır.
Her düzen dosyası için bir bağlama sınıfı oluşturulur. Varsayılan olarak sınıfın adı, Binding son eki eklenmiş ve Pascal harf biçimine dönüştürülen düzen dosyasının adıdır. Örneğin, düzenin dosya adı activity_main.xml
ise karşılık gelen oluşturulan sınıf ActivityMainBinding
olur.
Bu sınıf, düzen özelliklerinden düzen görünümlerine kadar tüm bağlamaları içerir ve bağlama ifadeleri için nasıl değer atanacağını bilir.
Bağlama nesnesi oluşturma
Bağlama nesnesi, görünüm hiyerarşisinin düzen içinde ifadeler içeren görünümlere bağlanmadan önce değiştirilmediğinden emin olmak için düzen genişletildikten hemen sonra oluşturulur. Nesneyi bir düzene bağlamanın en yaygın yöntemi, bağlama sınıfında statik yöntemleri kullanmaktır. Aşağıdaki örnekte gösterildiği gibi, bağlama sınıfının inflate()
yöntemini kullanarak görünüm hiyerarşisini artırabilir ve nesneyi nesneye bağlayabilirsiniz:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater) setContentView(binding.root) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater()); setContentView(binding.root); }
Aşağıdaki örnekte gösterildiği gibi , inflate()
yönteminin LayoutInflater
nesnesine ek olarak ViewGroup
nesnesini alan alternatif bir sürümü vardır:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)
Java
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);
Düzen farklı bir mekanizma kullanılarak şişirilmişse aşağıdaki gibi ayrı olarak bağlayabilirsiniz:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
Java
MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);
Bazen bağlama türünü önceden bilmezsiniz. Bu tür durumlarda, aşağıdaki kod snippet'inde gösterildiği gibi DataBindingUtil
sınıfını kullanarak bağlamayı oluşturabilirsiniz:
Kotlin
val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent) val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)
Java
View viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent); ViewDataBinding binding = DataBindingUtil.bind(viewRoot);
Fragment
, ListView
veya RecyclerView
adaptöründe veri bağlama öğeleri kullanıyorsanız aşağıdaki kod örneğinde gösterildiği gibi bağlama sınıflarının veya DataBindingUtil
sınıfının inflate()
yöntemlerini kullanmayı tercih edebilirsiniz:
Kotlin
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false) // or val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
Java
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); // or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
Kimlik içeren görünümler
Veri Bağlama Kitaplığı, düzende kimliği olan her görünüm için bağlama sınıfında sabit bir alan oluşturur. Örneğin, Veri Bağlama Kitaplığı TextView
türündeki firstName
ve lastName
alanlarını aşağıdaki düzenden oluşturur:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:id="@+id/firstName"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:id="@+id/lastName"/>
</LinearLayout>
</layout>
Kitaplık, görünüm hiyerarşisinden kimlikler dahil olmak üzere görünümleri tek bir kartta ayıklar. Bu mekanizma, düzendeki her görünüm için findViewById()
yöntemini çağırmaktan daha hızlı olabilir.
Kimlikler, veri bağlamaları olmadan gerektiği kadar gerekli değildir ancak koddan görünümlere erişimin gerekli olduğu bazı durumlar vardır.
Değişkenler
Veri Bağlama Kitaplığı, düzende tanımlanan her değişken için erişimci yöntemleri oluşturur. Örneğin, aşağıdaki düzen user
, image
ve note
değişkenleri için bağlama sınıfında setter ve getter yöntemleri oluşturur:
<data>
<import type="android.graphics.drawable.Drawable"/>
<variable name="user" type="com.example.User"/>
<variable name="image" type="Drawable"/>
<variable name="note" type="String"/>
</data>
Görünümler
Normal görünümlerden farklı olarak ViewStub
nesneleri görünmez görünümler olarak başlar. Görünür hale getirildiğinde veya açıkça şişirildiğinde, başka bir düzeni şişirerek düzende kendilerini değiştirirler.
ViewStub
görünüm hiyerarşisinden kaybolduğundan, çöp toplama tarafından hak talebinde bulunabilmesi için bağlama nesnesindeki görünümün de kaybolması gerekir.
Görünümler nihai olduğundan, ViewStubProxy
nesnesi, oluşturulan bağlama sınıfında ViewStub
öğesinin yerini alır. Böylece, var olduğunda ViewStub
öğesine ve ViewStub
büyütüldüğünde büyütülmüş görünüm hiyerarşisine erişebilirsiniz.
Başka bir düzen genişletilirken yeni düzen için bir bağlama oluşturulmalıdır.
Bu nedenle ViewStubProxy
, ViewStub
OnInflateListener
öğesini dinlemeli ve gerektiğinde bağlantıyı oluşturmalıdır. Aynı anda yalnızca bir işleyici olabileceğinden ViewStubProxy
, bağlantıyı oluşturduktan sonra çağırdığı bir OnInflateListener
ayarlamanıza izin verir.
Anında bağlama
Bir değişken veya gözlemlenebilir nesne değiştiğinde, bağlama, sonraki kareden önce değişecek şekilde planlanır. Ancak bağlamanın hemen yürütülmesi gereken zamanlar vardır. Yürütmeyi zorunlu kılmak için executePendingBindings()
yöntemini kullanın.
Dinamik değişkenler
Bazen, belirli bağlama sınıfı bilinmiyor. Örneğin, rastgele düzenlere karşı çalışan bir RecyclerView.Adapter
, belirli bağlama sınıfını bilmez. Bu işlev, bağlama değerini, çağrı sırasında onBindViewHolder()
yöntemine atamalıdır.
Aşağıdaki örnekte, RecyclerView
öğesinin bir item
değişkenine sahip olacağı tüm düzenler. BindingHolder
nesnesi, ViewDataBinding
temel sınıfını döndüren bir getBinding()
yöntemine sahiptir.
Kotlin
override fun onBindViewHolder(holder: BindingHolder, position: Int) { item: T = items.get(position) holder.binding.setVariable(BR.item, item); holder.binding.executePendingBindings(); }
Java
public void onBindViewHolder(BindingHolder holder, int position) { final T item = items.get(position); holder.getBinding().setVariable(BR.item, item); holder.getBinding().executePendingBindings(); }
Arka plandaki mesaj dizisi
Arka plan iş parçacığında veri modelinizi, koleksiyon olmadığı sürece değiştirebilirsiniz. Veri bağlama, eşzamanlılık sorunlarını önlemek için değerlendirme sırasında her değişkeni veya alanı yerelleştirir.
Özel bağlama sınıfı adları
Varsayılan olarak, düzen dosyasının adına göre bir bağlama sınıfı oluşturulur. Oluşturulan bağlantı büyük harfle başlar, alt çizgiler (_) kaldırılır, sonraki harf büyük hale getirilir ve Binding (Bağlayıcı) kelimesinin son eki eklenir. Örneğin, contact_item.xml
düzen dosyası ContactItemBinding
sınıfını oluşturur. Sınıf, modül paketinin altında bir databinding
paketine yerleştirilir. Örneğin, modül paketi com.example.my.app
ise bağlama sınıfı com.example.my.app.databinding
paketine yerleştirilir.
Bağlama sınıfları yeniden adlandırılabilir veya data
öğesinin class
özelliği ayarlanarak farklı paketlere yerleştirilebilir. Örneğin, aşağıdaki düzen geçerli modüldeki databinding
paketinde ContactItem
bağlama sınıfını oluşturur:
<data class="ContactItem">
...
</data>
Sınıf adının önüne nokta ekleyerek bağlama sınıfını farklı bir pakette oluşturabilirsiniz. Aşağıdaki örnek, modül paketinde bağlama sınıfını oluşturur:
<data class=".ContactItem">
...
</data>
Bağlama sınıfının oluşturulmasını istediğiniz yerde tam paket adını da kullanabilirsiniz. Aşağıdaki örnek, com.example
paketinde ContactItem
bağlama sınıfını oluşturur:
<data class="com.example.ContactItem">
...
</data>
Ek kaynaklar
Veri bağlama hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken gösterilir
- Düzenler ve bağlama ifadeleri
- Veri Bağlama Kitaplığı
- Bağlantıyı görüntüleyin