Düzenler ve bağlama ifadeleri

İfade dili, gönderilen etkinlikleri işleyen ifadeler yazmanıza olanak tanır görüntüleme sayısına göre Veri Bağlama Kitaplığı, gerekli sınıfları otomatik olarak oluşturur kullanarak düzendeki görünümleri veri nesnelerinize bağlayabilirsiniz.

Veri bağlama düzen dosyaları biraz farklıdır ve şu kök etiketiyle başlar: layout ve ardından bir data öğesi ve bir view kök öğesi. Bu görünüm öğesi, bağlayıcı olmayan bir düzen dosyasında kökünüzün bulunduğu öğedir. Aşağıdaki kod , örnek bir düzen dosyası gösterir:

<?xml version="1.0" encoding="utf-8"?>
<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}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

data içindeki user değişkeni, şu düzeni kullanın:

<variable name="user" type="com.example.User" />

Düzen içindeki ifadeler özellik özelliklerinde @{} söz dizimi. Aşağıdaki örnekte, TextView metni şuna ayarlandı: user değişkeninin firstName özelliği:

<TextView android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@{user.firstName}" />

Veri nesneleri

User varlığını tanımlayacak düz bir nesneniz olduğunu varsayalım:

Kotlin

data class User(val firstName: String, val lastName: String)

Java

public class User {
  public final String firstName;
  public final String lastName;
  public User(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
  }
}

Bu tür nesnede hiç değişmeyen veriler vardır. Uygulamalarda Bu veriler bir kez okunur ve daha sonra hiç değişmez. Ayrıca bir dizi resmi kullanabilirsiniz. belirli kurallara uyan bir nesne (örneğin, aşağıdaki örnekte gösterildiği gibi Java programlama dili:

Kotlin

// Not applicable in Kotlin.
data class User(val firstName: String, val lastName: String)

Java

public class User {
  private final String firstName;
  private final String lastName;
  public User(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
  }
  public String getFirstName() {
      return this.firstName;
  }
  public String getLastName() {
      return this.lastName;
  }
}

Veri bağlama açısından bu iki sınıf eşdeğerdir. İlgili içeriği oluşturmak için kullanılan @{user.firstName} ifadesi şunun için kullanıldı: android:text özelliği önceki sınıftaki firstName alanına ve getFirstName() yöntemini çağırın. Aynı zamanda firstName() (bu yöntem mevcutsa).

Verileri bağlama

Her düzen dosyası için bir bağlama sınıfı oluşturulur. Varsayılan olarak sınıfı, Pascal büyük/küçük harf düzenine dönüştürülen düzen dosyasının adına dayanır. Binding son eki. Örneğin, önceki düzen dosya adı activity_main.xml için geçerlidir. Yani, ilgili oluşturulan bağlama sınıfı ActivityMainBinding.

Bu sınıf, düzen özelliklerindeki tüm bağlamaları içerir. Örneğin, user değişkeni, düzenin görünümlerine çalışır ve değerlerin nasıl atanacağını bilir seçin. Bağlamaları şişirirken oluşturmanızı öneririz aşağıdaki örnekte gösterildiği gibi:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: ActivityMainBinding = DataBindingUtil.setContentView(
            this, R.layout.activity_main)

    binding.user = User("Test", "User")
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
   User user = new User("Test", "User");
   binding.setUser(user);
}

Uygulama, çalışma zamanında kullanıcı arayüzünde Test kullanıcısını gösterir. Alternatif olarak görünümü kullanmak için LayoutInflater, şu örneği inceleyin:

Kotlin

val binding: ActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater())

Java

ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());

Bir Fragment ListView veya RecyclerView adaptörü kullanmayı tercih ederseniz inflate() yöntemlerinin veya DataBindingUtil sınıfında aşağıdaki kod örneğinde gösterilmiştir:

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);

İfade dili

Ortak özellikler

İfade dili, yönetilen kodda bulunan ifadelere çok benzer. Siz ifade dilinde aşağıdaki operatörleri ve anahtar kelimeleri kullanabilir:

  • Matematiksel: + - / * %
  • Dize birleştirme: +
  • Mantıksal: && ||
  • İkili: & | ^
  • Birli: + - ! ~
  • Üst karakter: >> >>> <<
  • Karşılaştırma: == > < >= <= (<, &lt; olarak kod dışına alınmalıdır)
  • instanceof
  • Gruplandırma: ()
  • Karakter, Dize, sayısal, null gibi değişmez değerler
  • Yayınla
  • Yöntem çağrıları
  • Alan erişimi
  • Dizi erişimi: []
  • Üçlü operatör: ?:

Aşağıda bazı örnekler verilmiştir:

android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'

Eksik işlemler

Aşağıdaki işlemler, kullanabileceğiniz ifade söz diziminde eksik yönetilen kodda:

  • this
  • super
  • new
  • Açık genel çağrı

Boş birleştirme operatörü

Boş birleştirme operatörü (??), null değilse sol işleneni seçer veya ilk değer null ise sağ taraf:

android:text="@{user.displayName ?? user.lastName}"

Bu, işlevsel olarak aşağıdakine eşdeğerdir:

android:text="@{user.displayName != null ? user.displayName : user.lastName}"

Mülk referansları

Bir ifade, aşağıdaki biçimi kullanarak sınıftaki bir özelliğe başvuruda bulunabilir: Bu, alanlar, alıcılar ve ObservableField nesneler:

android:text="@{user.lastName}"

Boş işaretçi istisnalarından kaçınma

Oluşturulan veri bağlama kodu, null değerlerini otomatik olarak kontrol eder ve boş işaretçi istisnası. Örneğin, @{user.name} ifadesinde, user null, user.name için varsayılan null değeri atanmış. Şu durumda: referans user.age ise yaş int türündeyse veri bağlama varsayılan değere (0) sahip.

Referansları göster

Bir ifade, aşağıdakini kullanarak düzendeki diğer görünümlere kimliğe göre başvuruda bulunabilir söz dizimi:

android:text="@{exampleText.text}"

Aşağıdaki örnekte, TextView görünümü bir EditText görünümüne referans verir: aynı düzeni sağlar:

<EditText
    android:id="@+id/example_text"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"/>
<TextView
    android:id="@+id/example_output"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{exampleText.text}"/>

Koleksiyonlar

Diziler, listeler, seyrek listeler ve eşlemelerini sağlamalısınız.[]

<data>
    <import type="android.util.SparseArray"/>
    <import type="java.util.Map"/>
    <import type="java.util.List"/>
    <variable name="list" type="List&lt;String>"/>
    <variable name="sparse" type="SparseArray&lt;String>"/>
    <variable name="map" type="Map&lt;String, String>"/>
    <variable name="index" type="int"/>
    <variable name="key" type="String"/>
</data>
...
android:text="@{list[index]}"
...
android:text="@{sparse[index]}"
...
android:text="@{map[key]}"

Ayrıca, object.key gösterimini kullanarak haritadaki bir değere referansta bulunabilirsiniz. Örneğin, örnek, önceki örnekte @{map[key]} öğesini @{map.key}.

Dize değişmez değerleri

Özellik değerini başına tek tırnak işareti koyabilirsiniz. Bu özellik, aşağıdaki örnekte gösterildiği gibi, ifadede çift tırnak işareti:

android:text='@{map["firstName"]}'

Özellik değerinin başında ve sonunda çift tırnak işareti de kullanabilirsiniz. Bu sırada dize değişmez değerleri, gösterildiği gibi ` vurgu işaretleriyle çevrelenmelidir buradan inceleyebilirsiniz:

android:text="@{map[`firstName`]}"

Kaynaklar

Bir ifade, aşağıdaki söz dizimiyle uygulama kaynaklarına başvurabilir:

android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"

Parametreler sağlayarak biçim dizelerini ve çoğulları değerlendirebilirsiniz:

android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"

Mülk referanslarını iletebilir ve mülk referanslarını referansları kaynak parametreleri olarak ekleyin:

android:text="@{@string/example_resource(user.lastName, exampleText.text)}"

Bir çoğul birden fazla parametre aldığında tüm parametreleri iletin:


  Have an orange
  Have %d oranges

android:text="@{@plurals/orange(orangeCount, orangeCount)}"

Bazı kaynaklar, aşağıda gösterildiği gibi açık tür değerlendirmesi gerektirir tablo:

Tür Normal referans İfade referansı
String[] @array @stringArray
int[] @array @intArray
TypedArray @array @typedArray
Animator @animator @animator
StateListAnimator @animator @stateListAnimator
color int @color @color
ColorStateList @color @colorStateList

Olay işleme

Veri bağlama, görüntüleme sayısını artırır (örneğin, onClick() yöntemidir. Etkinlik özelliği adları, işleyici yönteminin adına göre belirlenir. birkaç istisna vardır. Örneğin, View.OnClickListener yöntemi olarak onClick() kullanılır. Bu nedenle bu etkinliğin özelliği android:onClick.

Tıklama etkinliği için özelliğinde android:onClick farklı bir özelliği kullanın. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için aşağıdaki özellikleri kullanın:

Sınıf Dinleyici belirleyici Özellik
SearchView setOnSearchClickListener(View.OnClickListener) android:onSearchClick
ZoomControls setOnZoomInClickListener(View.OnClickListener) android:onZoomIn
ZoomControls setOnZoomOutClickListener(View.OnClickListener) android:onZoomOut

Bu iki mekanizmayı kullanabilirsiniz. Bu mekanizmalar, Analytics 360'taki bir etkinliği işlemek için:

  • Yöntem referansları: İfadelerinizde şunları yapabilirsiniz: ve dinleyici yönteminin imzasına uygun referans yöntemlere başvurmalıdır. Zaman bir ifade bir yöntem referansına dönüşür, veri bağlama ise yöntemi sarmalar referans ve sahip nesnesini belirler ve bu işleyiciyi hedef görünümü. İfade null olarak değerlendirilirse veri bağlama işleyici oluşturabilir ve bunun yerine bir null işleyicisi ayarlayabilirsiniz.
  • Dinleyici bağlamaları: Bunlar, anında yanıt veren lambda ifadeleridir etkinlik gerçekleştiğinde değerlendirilir. Veri bağlama her zaman işleyiciyi seçin. Etkinlik gönderildiğinde işleyici, lambda ifadesini değerlendirir.

Yöntem referansları

Aşağıdaki yönteme benzer şekilde etkinlikleri doğrudan işleyici yöntemlerine bağlayabilirsiniz: ata android:onClick itibarıyla bir yöntemini kullanabilirsiniz. Bir avantaja kıyasla View onClick özelliği, ifadesi, derleme sırasında işlenir. Yöntem mevcut değilse veya imza yanlışsa derleme zamanı hatası alırsınız.

Yöntem referansları ve işleyici bağlamaları arasındaki en önemli fark gerçek dinleyici uygulaması, tetiklendiği anlamına gelir. Söz konusu etkinlik gerçekleştiğinde ifadeyi değerlendirmeyi işleyici bağlamalarını kullanın.

Bir etkinliği işleyicisine atamak için değeri çağrılacak yöntem adıdır. Örneğin, düzen veri nesnesi:

Kotlin

class MyHandlers {
    fun onClickFriend(view: View) { ... }
}

Java

public class MyHandlers {
    public void onClickFriend(View view) { ... }
}

Bağlama ifadesi, onClickFriend() yöntemini kullanın:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.MyHandlers"/>
       <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:onClick="@{handlers::onClickFriend}"/>
   </LinearLayout>
</layout>

İşleyici bağlamaları

İşleyici bağlamaları, bir etkinlik gerçekleştiğinde çalışan bağlayıcı ifadelerdir. Onlar yöntem referanslarına benzer ancak rastgele veri bağlama çalıştırmanıza olanak tanırlar ifade eder. Bu özellik Gradle için Android Gradle Eklentisi ile kullanılabilir 2.0 veya daha yeni bir sürüme sahip olduğunuzdan emin olun.

Yöntem referanslarında, yöntemin parametreleri yardımcı olur. İşleyici bağlamalarında yalnızca döndürülen değeriniz void beklemiyorsa işleyicinin beklenen dönüş değeri. Örneğin, örneği, onSaveClick() olan aşağıdaki sunucu sınıfını ele alalım yöntem:

Kotlin

class Presenter {
    fun onSaveClick(task: Task){}
}

Java

public class Presenter {
    public void onSaveClick(Task task){}
}

Tıklama etkinliğini onSaveClick() yöntemine aşağıdaki şekilde bağlayabilirsiniz:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="task" type="com.android.example.Task" />
        <variable name="presenter" type="com.android.example.Presenter" />
    </data>
    <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
        <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:onClick="@{() -> presenter.onSaveClick(task)}" />
    </LinearLayout>
</layout>

Bir ifadede geri çağırma kullanıldığında, veri bağlaması otomatik olarak ve etkinlik için kaydeder. Görüntü veri bağlama, verilen ifadeyi değerlendirir. Normal bağlamada olduğu gibi ifadeleri için aşağıdaki işlemler sırasında veri bağlamanın boş ve iş parçacığı güvenliğini alırsınız: nasıl değerlendirildiğini açıklayacağız.

Yukarıdaki örnekte, onClick(View) parametresine iletilen view parametresi tanımlanmamıştır. İşleyici bağlamaları, işleyici parametreleri için iki seçenek sunar: yöntemin tüm parametrelerini yok sayabilir veya hepsini adlandırabilirsiniz. Dilerseniz bunları ifadenizde kullanabilirsiniz. Örneğin, önceki ifadeyi aşağıdaki gibi yazabilir:

android:onClick="@{(view) -> presenter.onSaveClick(task)}"

İfadede parametreyi kullanmak istiyorsanız bunu aşağıdaki şekilde yapabilirsiniz:

Kotlin

class Presenter {
    fun onSaveClick(view: View, task: Task){}
}

Java

public class Presenter {
    public void onSaveClick(View view, Task task){}
}
android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"

Bir lambda ifadesini birden fazla parametreyle kullanabilirsiniz:

Kotlin

class Presenter {
    fun onCompletedChanged(task: Task, completed: Boolean){}
}

Java

public class Presenter {
    public void onCompletedChanged(Task task, boolean completed){}
}
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />

Dinlediğiniz etkinlik, türü void olmayan bir değer döndürürse ifadelerinin de aynı türde değeri döndürmesi gerekir. Örneğin, dokunmayı dinleyin ve bekleme (uzun tıklama) etkinliği olduğunda, ifadeniz bir boole'ye dokunun.

Kotlin

class Presenter {
    fun onLongClick(view: View, task: Task): Boolean { }
}

Java

public class Presenter {
    public boolean onLongClick(View view, Task task) { }
}
android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"

İfade, null nesne nedeniyle değerlendirilemezse veri bağlama döndürülür bu tür için varsayılan değer (örneğin, referans türleri için null, referans türleri için 0) int veya boolean boyunca false.

Bir yüklem içeren bir ifade kullanmanız gerekirse (örneğin, üçlü — void öğesini simge olarak kullanabilirsiniz:

android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"

Karmaşık dinleyicilerden kaçının

İşleyici ifadeleri güçlüdür ve kodunuzun daha kolay okunmasını sağlayabilir. Öte yandan, karmaşık ifadeler içeren işleyiciler düzenlerinizi zorlaştırır. kolay bir yoludur. İfadelerinizi, mevcut verileri iletmek kadar basit tutun geri çağırma yönteminizden aktarın. Herhangi bir iş mantığını geri çağırma yöntemini kullanabilirsiniz.

İçe aktarma işlemleri, değişkenler ve içerir

Veri Bağlama Kitaplığı; içe aktarma işlemleri, değişkenler ve içerir. İçe aktarma işlemleri, düzen dosyalarınızdaki sınıflara kolayca başvuru yapmanızı sağlar. Değişkenler, bağlama ifadelerinde kullanılabilecek bir özelliği tanımlamanıza olanak tanır. İçerikler, karmaşık düzenleri uygulamanızda tekrar kullanmanızı sağlar.

İçe aktarmalar

İçe aktarma işlemleri, yönetilen kodda olduğu gibi, düzen dosyanızdaki sınıflara başvuruda bulunmanıza olanak tanır. data öğesinin içinde sıfır veya daha fazla import öğesi kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan aşağıdaki kod örneği, View sınıfını düzen dosyasına aktarır:

<data>
    <import type="android.view.View"/>
</data>

View sınıfını içe aktardığınızda, bu sınıfa bağlama ifadelerinizden başvuruda bulunabilirsiniz. Aşağıdaki örnekte, VISIBLE ve View sınıfının GONE sabitleri:

<TextView
   android:text="@{user.lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

Takma adları yazın

Sınıf adı çakışmaları olduğunda sınıflardan birini takma ad'dır. Aşağıdaki örnekte, View sınıfının adı Vista grubuna com.example.real.estate paketi:

<import type="android.view.View"/>
<import type="com.example.real.estate.View"
        alias="Vista"/>

Daha sonra com.example.real.estate.View ve View referansları için Vista kullanabilirsiniz öğesine de başvurmalıdır.android.view.View

Diğer sınıfları içe aktar

İçe aktarılan türleri, değişkenlerde ve ifadelerde tür referansı olarak kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan aşağıdaki örnekte değişken türü olarak kullanılan User ve List gösterilmektedir:

<data>
    <import type="com.example.User"/>
    <import type="java.util.List"/>
    <variable name="user" type="User"/>
    <variable name="userList" type="List&lt;User>"/>
</data>

Bir ifadenin bir kısmını yayınlamak için içe aktarılan türleri kullanabilirsiniz. Aşağıdakiler örnek, connection özelliğini bir User türüne dönüştürür:

<TextView
   android:text="@{((User)(user.connection)).lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

İçe aktarılan türleri, ifade eder. Aşağıdaki kod, MyStringUtils sınıfını ve referansları içe aktarır capitalize yöntemi:

<data>
    <import type="com.example.MyStringUtils"/>
    <variable name="user" type="com.example.User"/>
</data>
…
<TextView
   android:text="@{MyStringUtils.capitalize(user.lastName)}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

java.lang.*, yönetilen kodda olduğu gibi otomatik olarak içe aktarılır.

Değişkenler

data öğesinin içinde birden fazla variable öğesi kullanabilirsiniz. Her biri variable öğesi, kullanılacak düzende ayarlanabilecek bir özelliği açıklar bağlama ifadelerinde kullanabilirsiniz. Aşağıdaki örnekte, user, image ve note değişkenleri:

<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>

Değişken türleri, derleme sırasında incelenir. Bu nedenle, bir değişken Observable veya bir gözlemlenebilir koleksiyon, yansıtılması gerekir. Değişken bir temel sınıf veya arayüzse Observable arayüzünü uygulamayayan değişkenler kullanılmaz gözlemlendi.

Çeşitli yapılandırmalar için farklı düzen dosyaları (örneğin, yatay veya dikey) değişkenler birleştirilir. Kodlarda, Bu düzen dosyaları arasında çelişen değişken tanımları var.

Oluşturulan bağlama sınıfında, açıklanan değişkenlerine karşılık gelir. Değişkenler, belirleyiciye kadar varsayılan yönetilen kod değerlerini alır çağrılır—referans türleri için null, referans türleri için 0, int için false boolean vb.

Bağlama ifadelerinde kullanılmak üzere context adlı özel bir değişken oluşturulur gerekir. context için değer: Kök görünümünün Context nesnesinden getContext() yöntemini kullanarak giriş yapabilirsiniz. İlgili içeriği oluşturmak için kullanılan context değişkeni, dokunun.

İçerir

Değişkenleri, kapsayıcı düzeninden dahil edilen bir düzenin bağlamasına aktarabilirsiniz düzeni değiştirebilirsiniz. İlgili içeriği oluşturmak için kullanılan aşağıdaki örnekte name.xml veuser contact.xml düzen dosyaları:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
   </LinearLayout>
</layout>

Veri bağlama, birleştirme öğesinin doğrudan alt öğesi olarak eklemeyi desteklemez. Örneğin, aşağıdaki düzen desteklenmez:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <merge><!-- Doesn't work -->
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
   </merge>
</layout>

Ek kaynaklar

Veri bağlama hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.

Örnekler

Codelab'ler

Blog yayınları