Oluşturulan bağlama sınıfları

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.