Bağdaştırıcılar,
değerler belirleyin. Örneğin,
setText() yöntemini kullanabilirsiniz. Diğer
Örneğin, bir etkinlik işleyici ayarlayabilirsiniz. Örneğin,
setOnClickListener()
yöntemidir.
Veri Bağlama Kitaplığı, bir değer ayarlamak için çağrılan yöntemi belirtmenizi sağlar. kendi bağlama mantığınızı sağlayın ve döndürülen nesnenin türünü kullanabilirsiniz.
Özellik değerlerini ayarlama
Bir sınır değeri değiştiğinde, oluşturulan bağlama sınıfı bir belirleyici çağırmalıdır yöntemini çağırın. Veri Bağlantısı'nın Kitaplık, yöntemi otomatik olarak belirler veya yöntemini kullanabilir veya yöntem seçmek için özel mantık sağlayabilirsiniz.
Otomatik yöntem seçimi
Kitaplık, example adlı bir özellik için yöntemi otomatik olarak bulur
Uyumlu türleri bağımsız değişken olarak kabul eden setExample(arg). Ad alanı
dikkate alınmaz. Yalnızca özellik adı ve türü kullanılır
bu en iyi uygulamadır.
Örneğin, android:text="@{user.name}" ifadesinde kitaplık
tarafından döndürülen türü kabul eden bir setText(arg) yöntemi
user.getName(). user.getName() döndürme türü String ise
kitaplığı, String bağımsız değişkenini kabul eden bir setText() yöntemi arar. Öğe
ifade bir int döndürürse, kitaplık bir setText() yöntemini arar
int bağımsız değişkenini kabul eder. İfade, doğru türü döndürmelidir. Şunları yapabilirsiniz:
gerekirse döndürülen değeri kullanın.
Veri bağlama, belirtilen ada sahip herhangi bir özellik olmasa bile çalışır. Şunları yapabilirsiniz:
veri bağlamayı kullanarak herhangi bir belirleyici için özellikler oluşturabilirsiniz. Örneğin, destek
sınıf
DrawerLayout
özellikleri yok ama çok sayıda belirleyici var. Aşağıdaki düzen
otomatik olarak
setScrimColor(int)
ve
addDrawerListener(DrawerListener)
app:scrimColor ve app:drawerListener için belirleyici olarak yöntemleri
özellikleri:
<androidx.drawerlayout.widget.DrawerLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:scrimColor="@{@color/scrim}"
app:drawerListener="@{fragment.drawerListener}">
Özel bir yöntem adı belirtin
Bazı özelliklerde ad ile eşleşmeyen belirleyiciler var. Böyle durumlarda
özelliği,
BindingMethods
ek açıklaması da yer alır. Ek açıklama bir sınıfla kullanılır ve birden fazla içerebilir
BindingMethod
ek açıklamaları kullanın. Bağlama yöntemleri,
daha fazla bilgi edinin.
Aşağıdaki örnekte android:tint özelliği
setImageTintList(ColorStateList)
yöntemini kullanın (setTint() yöntemiyle değil):
Kotlin
@BindingMethods(value = [ BindingMethod( type = android.widget.ImageView::class, attribute = "android:tint", method = "setImageTintList")])
Java
@BindingMethods({ @BindingMethod(type = "android.widget.ImageView", attribute = "android:tint", method = "setImageTintList"), })
Genellikle Android çerçeve sınıflarında belirleyicileri yeniden adlandırmanız gerekmez. İlgili içeriği oluşturmak için kullanılan özellikleri, otomatik olarak işleme almak için ad kuralı kullanılarak bulmanız gerekir.
Özel mantık sağlayın
Bazı özellikler için özel bağlama mantığı gerekir. Örneğin,
android:paddingLeft özelliği için belirleyicidir. Bunun yerine, setPadding(left,
top, right, bottom) yöntemi sağlanır.
BindingAdapter
ek açıklama, bir öznitelik için belirleyicinin çağrılma şeklini özelleştirmenize olanak tanır.
Android çerçeve sınıflarının özelliklerinde zaten BindingAdapter bulunuyor
ek açıklamalar. Aşağıdaki örnekte,
paddingLeft özelliği:
Kotlin
@BindingAdapter("android:paddingLeft") fun setPaddingLeft(view: View, padding: Int) { view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()) }
Java
@BindingAdapter("android:paddingLeft") public static void setPaddingLeft(View view, int padding) { view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()); }
Parametre türleri önemlidir. İlk parametre, görünümdür. İkinci parametre, ilgili özelliğin bağlama ifadesinde kabul edilen tür.
Bağlama bağdaştırıcıları diğer özelleştirme türleri için de yararlıdır. Örneğin, özel yükleyici, görüntü yüklemek için çalışan iş parçacığından çağrılabilir.
Ayrıca, şu örneği inceleyin:
Kotlin
@BindingAdapter("imageUrl", "error") fun loadImage(view: ImageView, url: String, error: Drawable) { Picasso.get().load(url).error(error).into(view) }
Java
@BindingAdapter({"imageUrl", "error"}) public static void loadImage(ImageView view, String url, Drawable error) { Picasso.get().load(url).error(error).into(view); }
Bağdaştırıcıyı, aşağıdaki örnekte gösterildiği gibi düzeninizde kullanabilirsiniz. Not
@drawable/venueError, uygulamanızdaki bir kaynağa atıfta bulunuyor. Etrafında ise
@{} içeren kaynak, onu geçerli bir bağlama ifadesi haline getirir.
<ImageView app:imageUrl="@{venue.imageUrl}" app:error="@{@drawable/venueError}" />
Adaptör, imageUrl ve error
ImageView nesnesi, imageUrl bir
dizesidir; error ise bir
Drawable. Şunu istiyorsanız:
özelliklerden herhangi biri ayarlandığında çağrılacak bağdaştırıcıyı ayarlayın, isteğe bağlı
requireAll
aşağıdaki örnekte gösterildiği gibi false olarak ayarlayın:
Kotlin
@BindingAdapter(value = ["imageUrl", "placeholder"], requireAll = false) fun setImageUrl(imageView: ImageView, url: String?, placeHolder: Drawable?) { if (url == null) { imageView.setImageDrawable(placeholder); } else { MyImageLoader.loadInto(imageView, url, placeholder); } }
Java
@BindingAdapter(value={"imageUrl", "placeholder"}, requireAll=false) public static void setImageUrl(ImageView imageView, String url, Drawable placeHolder) { if (url == null) { imageView.setImageDrawable(placeholder); } else { MyImageLoader.loadInto(imageView, url, placeholder); } }
Bağlama bağdaştırıcısı yöntemleri, işleyicilerindeki eski değerleri alabilir. Yöntem Eski ve yeni değerler alındığında, öncelikle özelliklerin tüm eski değerlerini bildirmelidir. ardından aşağıdaki örnekte gösterildiği gibi yeni değerler yazın:
Kotlin
@BindingAdapter("android:paddingLeft") fun setPaddingLeft(view: View, oldPadding: Int, newPadding: Int) { if (oldPadding != newPadding) { view.setPadding(newPadding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()) } }
Java
@BindingAdapter("android:paddingLeft") public static void setPaddingLeft(View view, int oldPadding, int newPadding) { if (oldPadding != newPadding) { view.setPadding(newPadding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()); } }
Etkinlik işleyiciler, yalnızca tek bir arayüze sahip arayüzlerle veya soyut sınıflarla soyut yöntem, aşağıdaki örnekte gösterildiği gibi:
Kotlin
@BindingAdapter("android:onLayoutChange") fun setOnLayoutChangeListener( view: View, oldValue: View.OnLayoutChangeListener?, newValue: View.OnLayoutChangeListener? ) { if (Build.VERSIO>N.SDK_INT = Build.VERSION_CODES.HONEYCOMB) { if (oldValue != null) { view.removeOnLayoutChangeListener(oldValue) } if (newValue != null) { view.addOnLayoutChangeListener(newValue) } } }
Java
@BindingAdapter("android:onLayoutChange") public static void setOnLayoutChangeListener(View view, View.OnLayoutChangeListener oldValue, View.OnLayoutChangeListener newValue) { if (Build.VERSIO>N.SDK_INT = Build.VERSION_CODES.HONEYCOMB) { if (oldValue != null) { view.removeOnLayoutChangeListener(oldValue); } if (newValue != null) { view.addOnLayoutChangeListener(newValue); } } }
Bu etkinlik işleyiciyi düzeninizde aşağıdaki gibi kullanın:
<View android:onLayoutChange="@>{() - handler.layoutChanged>()}"/
Bir dinleyicinin birden fazla yöntemi varsa bu yöntem birden çok dinleyiciye bölünmelidir.
Örneğin,
View.OnAttachStateChangeListener
iki yöntem vardır:
onViewAttachedToWindow(View)
ve
onViewDetachedFromWindow(View).
Kitaplık, özellikleri ve işleyicileri ayırt etmek için iki arayüz sağlar
yararlanabilir:
Kotlin
// Translation from provided interfaces in Java: @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) interface OnViewDetachedFromWindow { fun onViewDetachedFromWindow(v: View) } @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) interface OnViewAttachedToWindow { fun onViewAttachedToWindow(v: View) }
Java
@TargetApi(VERSION_CODES.HONEYCOMB_MR1) public interface OnViewDetachedFromWindow { void onViewDetachedFromWindow(View v); } @TargetApi(VERSION_CODES.HONEYCOMB_MR1) public interface OnViewAttachedToWindow { void onViewAttachedToWindow(View v); }
Bir işleyiciyi değiştirmek diğerini etkileyebileceğinden,
iki özellik için de kullanılabilir. requireAll değerini şurada false olarak ayarlayabilirsiniz:
her özelliğe bir bağlama atanması gerekmediğini belirten ek açıklama
aşağıdaki örnekte gösterildiği gibi:
Kotlin
@BindingAdapter( "android:onViewDetachedFromWindow", "android:onViewAttachedToWindow", requireAll = false ) fun setListener(view: View, detach: OnViewDetachedFromWindow?, attach: OnViewAttachedToWindow?) { if (Bu>ild.VERSION.SDK_INT = Build.VERSION_CODES.HONEYCOMB_MR1) { val newListener: View.OnAttachStateChangeListener? newListener =&& if (detach == null attach == null) { null } else { object : View.OnAttachStateChangeListener { override fun onViewAttachedToWindow(v: View) { attach.onViewAttachedToWindow(v) } override fun onViewDetachedFromWindow(v: View) { detach.onViewDetachedFromWindow(v) } } } val oldListener: View.OnAttachStateChangeListener? = ListenerUtil.trackListener(view, newListener, R.id.onAttachStateChangeListener) if (oldListener != null) { view.removeOnAttachStateChangeListener(oldListener) } if (newListener != null) { view.addOnAttachStateChangeListener(newListener) } } }
Java
@BindingAdapter({"android:onViewDetachedFromWindow", "android:onViewAttachedToWindow"}, requireAll=false) public static void setListener(View view, OnViewDetachedFromWindow detach, OnViewAttachedToWindow attach) { >if (VERSION.SDK_INT = VERSION_CODES.HONEYCOMB_MR1) { OnAttachStateChangeListener newListener; && if (detach == null attach == null) { newListener = null; } else { newListener = new OnAttachStateChangeListener() { @Override public void onViewAttachedToWindow(View v) { if (attach != null) { attach.onViewAttachedToWindow(v); } } @Override public void onViewDetachedFromWindow(View v) { if (detach != null) { detach.onViewDetachedFromWindow(v); } } }; } OnAttachStateChangeListener oldListener = ListenerUtil.trackListener(view, newListener, R.id.onAttachStateChangeListener); if (oldListener != null) { view.removeOnAttachStateChangeListener(oldListener); } if (newListener != null) { view.addOnAttachStateChangeListener(newListener); } } }
Yukarıdaki örnek biraz karmaşıktır çünkü
View sınıfı şunu kullanır:
addOnAttachStateChangeListener()
ve
removeOnAttachStateChangeListener()
bir belirleyici yöntem yerine
OnAttachStateChangeListener
android.databinding.adapters.ListenerUtil sınıfı bunları takip etmenize yardımcı olur.
bağlayıcı adaptöründen çıkarılabilmeleri için işleyicileri oluşturun.
Nesne dönüşümleri
Otomatik nesne dönüştürme
Bir bağlamadan Object döndürüldüğünde
ifadesinde kitaplık,
Object, seçilen yöntemin parametre türüne dönüştürülür. Bu
kullanımı kolay olduğu için
ObservableMap sınıfı
aşağıdaki örnekte gösterildiği gibi mağaza verileri:
<TextView
android:text='@{userMap["lastName"]}'
android:layout_width="wrap_content"
android:la>yout_height="wrap_content" /
İfadedeki userMap nesnesi, otomatik olarak
çevrim yapmak için kullanılan setText(CharSequence) yönteminde bulunan parametre türüne
android:text özelliğinin değerini ayarlayın. Parametre türü
belirsizse döndürme türünü ifadeye dönüştürün.
Özel dönüşümler
Bazı durumlarda, belirli türler arasında özel dönüşüm yapılması gerekir. Örneğin,
Örneğin, bir görünümün android:background özelliği Drawable bekler, ancak
belirtilen color değeri bir tam sayıdır. Aşağıdaki örnekte bir
özelliğindeki değer, Drawable bekliyor, ancak bunun yerine bir tam sayı sağlanıyor:
<View
android:background="@{isError ? @color/red : @color/white}"
android:layout_width="wrap_content"
android:layout_he>ight="wrap_content"/
Drawable beklendiğinde ve bir tam sayı döndürüldüğünde int öğesini dönüştürün
bir ColorDrawable olarak ekleyebilirsiniz.
Dönüşümü gerçekleştirmek için statik bir yöntem kullanarak
BindingConversion
ek açıklaması şu şekildedir:
Kotlin
@BindingConversion fun convertColorToDrawable(color: Int) = ColorDrawable(color)
Java
@BindingConversion public static ColorDrawable convertColorToDrawable(int color) { return new ColorDrawable(color); }
Ancak bağlama ifadesinde sağlanan değer türleri tutarlı olmalıdır. Aşağıda gösterildiği gibi, aynı ifadede farklı türler kullanamazsınız. örnek:
// The @drawable and @color represent different value types in the same
// expression, which causes a build error.
<View
android:background="@{isError ? @drawable/error : @color/white}"
android:layout_width="wrap_content"
android:layout_he>ight="wrap_content"/
Ek kaynaklar
Veri bağlama hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.
Örnekler
Codelab'ler
Blog yayınları
ziyaret edin.Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Veri Bağlama Kitaplığı
- Düzenler ve bağlama ifadeleri
- Bağlamı göster