التنسيقات وتعبيرات الربط

تتيح لك لغة التعبير كتابة التعبيرات التي تتعامل مع الأحداث المُرسلة بواسطة طرق العرض. تنشئ "مكتبة ربط البيانات" تلقائيًا الفئات المطلوبة لربط طرق العرض في التخطيط بكائنات البيانات.

تختلف ملفات تنسيق ربط البيانات قليلاً وتبدأ بعلامة جذر layout، ويليها عنصر data وعنصر جذر view. عنصر العرض هذا هو الجذر في ملف تخطيط غير ملزم. تعرض التعليمة البرمجية التالية نموذج ملف تخطيط:

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

يصف المتغيّر user ضمن data سمة يمكن استخدامها في هذا التنسيق:

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

وتتم كتابة التعبيرات داخل التنسيق في سمات السمة باستخدام بنية @{}. في المثال التالي، يتم ضبط النص TextView على السمة firstName للمتغيّر user:

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

كائنات البيانات

لنفترض أنّ لديك كائنًا عاديًا لوصف الكيان User:

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

يحتوي هذا النوع من العناصر على بيانات لا تتغير أبدًا. من الشائع في التطبيقات أن يكون لديك بيانات تتم قراءتها مرة واحدة ولا تتغير بعد ذلك. من الممكن أيضًا استخدام كائن يتبع مجموعة من الاصطلاحات، مثل استخدام طرق الوصول في لغة برمجة Java، كما هو موضح في المثال التالي:

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

من منظور ربط البيانات، تتشابه هاتان الفئتان. يصل التعبير @{user.firstName} المستخدَم للسمة android:text إلى الحقل firstName في الفئة السابقة وطريقة getFirstName() في الفئة الثانية. ويتم حل المشكلة أيضًا في firstName()، إذا توفرت هذه الطريقة.

ربط البيانات

يتم إنشاء فئة ربط لكل ملف تنسيق. يستند اسم الفئة تلقائيًا إلى اسم ملف التنسيق الذي يتم تحويله إلى حالة Pascal مع إضافة لاحقة الربط إليه. على سبيل المثال، اسم ملف التنسيق السابق هو activity_main.xml، وبالتالي تكون فئة الربط المقابلة التي تم إنشاؤها هي ActivityMainBinding.

تحتوي هذه الفئة على جميع الروابط من خصائص التنسيق، مثل المتغيّر user، إلى طرق عرض التنسيق، وتعرف كيفية تحديد قيم لتعبيرات الربط. نوصي بإنشاء الروابط أثناء تضخيم التنسيق، كما هو موضح في المثال التالي:

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

في وقت التشغيل، يعرض التطبيق المستخدم الاختبار في واجهة المستخدم. بدلاً من ذلك، يمكنك الاطّلاع على طريقة العرض باستخدام LayoutInflater، كما هو موضّح في المثال التالي:

Kotlin

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

Java

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

إذا كنت تستخدم عناصر ربط البيانات داخل معدِّل Fragment أو ListView أو RecyclerView ، ننصحك باستخدام طرق inflate() لفئات الروابط أو فئة DataBindingUtil، كما هو موضَّح في مثال الرمز البرمجي التالي:

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

لغة التعبير

الميزات الشائعة

تشبه لغة التعبير إلى حد كبير التعبيرات الموجودة في الرمز المُدار. يمكنك استخدام عوامل التشغيل والكلمات الرئيسية التالية في لغة التعبير:

  • رياضيات: + - / * %
  • دمج السلاسل: +
  • المنطقي: && ||
  • النظام الثنائي: & | ^
  • Unary: + - ! ~
  • Shift: >> >>> <<
  • المقارنة: == > < >= <= (يجب تخطي < باعتبارها &lt;)
  • instanceof
  • تجميع: ()
  • الأحرف الحرفية، مثل الحرف والسلسلة والرقمية وnull
  • البثّ
  • استدعاء الإجراءات
  • الوصول إلى الحقل
  • الوصول إلى المصفوفة: []
  • عامل التشغيل الثالث: ?:

وفي ما يلي بعض الأمثلة:

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

عمليات مفقودة

العمليات التالية مفقودة من بنية التعبير التي يمكنك استخدامها في التعليمات البرمجية المُدارة:

  • this
  • super
  • new
  • استدعاء عام صريح

عامل دمج فارغ

يختار عامل التضافر الفارغ (??) المعامل الأيسر إذا لم يكن null أو المعامل الأيمن إذا كان المعامل الأول null:

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

يكافئ هذا عمليًا ما يلي:

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

مراجع المواقع

يمكن أن يشير تعبير إلى خاصية في فئة باستخدام التنسيق التالي، وهو نفسه للحقول وحروف الحصول على وكائنات ObservableField:

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

تجنُّب استثناءات المؤشر الفارغ

يتحقّق رمز ربط البيانات الذي تم إنشاؤه تلقائيًا من قيم null ويتجنّب استثناءات المؤشر الفارغ. على سبيل المثال، في التعبير @{user.name}، إذا كانت قيمة user فارغة، يتم تخصيص القيمة التلقائية null للسمة user.name. إذا كنت تشير إلى user.age، حيث يكون العمر من النوع int، يستخدم ربط البيانات القيمة التلقائية 0.

عرض المراجع

يمكن أن يشير تعبير إلى طرق عرض أخرى في التنسيق حسب رقم التعريف، باستخدام البنية التالية:

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

في المثال التالي، تشير طريقة العرض TextView إلى طريقة عرض EditText في التنسيق نفسه:

<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}"/>

المجموعات

يمكنك الوصول إلى المجموعات الشائعة، مثل الصفائف والقوائم والقوائم المتفرقة والخرائط، وذلك باستخدام عامل التشغيل [] لتسهيل الأمر عليك.

<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]}"

يمكنك أيضًا الرجوع إلى قيمة في الخريطة باستخدام علامة object.key. على سبيل المثال، يمكنك استبدال @{map[key]} في المثال السابق بـ @{map.key}.

القيم الحرفية للسلسلة

يمكنك استخدام علامات اقتباس مفردة لإحاطة قيمة السمة، ما يتيح لك استخدام علامات الاقتباس المزدوجة في التعبير، كما هو موضح في المثال التالي:

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

يمكنك أيضًا استخدام علامات اقتباس مزدوجة لإحاطة قيمة السمة. عند إجراء ذلك، يجب إحاطة القيم الحرفية للسلسلة بفواصل عليا مائلة `، كما هو موضّح هنا:

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

المَراجع

يمكن أن يشير تعبير إلى موارد التطبيق باستخدام البنية التالية:

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

يمكنك تقييم سلاسل التنسيق وصيغ الجمع من خلال توفير المعلمات:

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

يمكنك ضبط مراجع المواقع وعرض المراجع كمَعلمات للموارد:

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

عندما تأخذ صيغة جمع عدة معلَمات، عليك ضبط جميع المعلَمات:


  Have an orange
  Have %d oranges

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

تتطلب بعض الموارد تقييمًا صريحًا للنوع، كما هو موضح في الجدول التالي:

Type مرجع عادي مرجع التعبير
String[] @array @stringArray
int[] @array @intArray
TypedArray @array @typedArray
Animator @animator @animator
StateListAnimator @animator @stateListAnimator
color int @color @color
ColorStateList @color @colorStateList

التعامل مع الأحداث

يتيح لك ربط البيانات كتابة أحداث معالجة التعبيرات التي يتم إرسالها من الملفات الشخصية، على سبيل المثال، الطريقة onClick(). يتمّ تحديد أسماء سمات الأحداث حسب اسم طريقة المستمع، مع بعض الاستثناءات. على سبيل المثال، يتضمن View.OnClickListener الطريقة onClick()، وبالتالي فإن سمة هذا الحدث هي android:onClick.

هناك بعض معالِجات الأحداث المتخصّصة لحدث النقر والتي تحتاج إلى سمة غير android:onClick لتجنُّب حدوث تعارض. يمكنك استخدام السمات التالية لتجنب هذا النوع من التعارضات:

الفئة أداة ضبط المستمع السمة
SearchView setOnSearchClickListener(View.OnClickListener) android:onSearchClick
ZoomControls setOnZoomInClickListener(View.OnClickListener) android:onZoomIn
ZoomControls setOnZoomOutClickListener(View.OnClickListener) android:onZoomOut

يمكنك استخدام هاتين الآليتين، الموضَّحتين بالتفصيل في الأقسام التالية، للتعامل مع حدث ما:

  • مراجع الطرق: في تعبيراتك، يمكنك الرجوع إلى طرق تتوافق مع توقيع طريقة المستمع. عند تقييم تعبير لمرجع طريقة، يلتف ربط البيانات مرجع الطريقة وكائن المالك في أداة معالجة ويضبط هذا المستمع على طريقة العرض المستهدفة. إذا تم تقييم التعبير إلى null، لا تنشئ عملية ربط البيانات أداة معالجة ويتم ضبطها بدلاً من ذلك على null.
  • روابط المستمعين: هي تعبيرات lambda يتم تقييمها عند وقوع الحدث. ينشئ ربط البيانات دائمًا مستمعًا يضبطه في طريقة العرض. عند إرسال الحدث، يقيّم المستمع تعبير lambda.

مراجع الطُرق

يمكنك ربط الأحداث بطرق المعالجات مباشرةً، بالطريقة نفسها التي يمكنك بها تخصيص android:onClick إلى طريقة في نشاط ما. من بين الميزات مقارنةً بالسمة onClick View، أنّ التعبير تتم معالجته في وقت التجميع. لذلك، إذا كانت الطريقة غير موجودة أو كان توقيعها غير صحيح، فستتلقى خطأ في وقت التجميع.

يكمن الفرق الرئيسي بين مراجع الطُرق وربط المستمعين في أنّه يتم إنشاء عملية التنفيذ الفعلية للمستمع عند ربط البيانات، وليس عند بدء الحدث. وإذا كنت تفضّل تقييم التعبير عند وقوع الحدث، استخدِم روابط المستمعين.

لتعيين حدث إلى معالجه، استخدم تعبير ربط عادي، مع أن تكون القيمة هي اسم الطريقة المطلوب استدعاءها. على سبيل المثال، ضع في الاعتبار مثال كائن بيانات التخطيط التالي:

Kotlin

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

Java

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

يمكن لتعبير الربط ضبط أداة معالجة النقرات لطريقة عرض onClickFriend() على النحو التالي:

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

روابط المستمعين

روابط المستمعين هي تعبيرات ربط يتم تشغيلها عند وقوع حدث. وهي تشبه مراجع المناهج، لكنها تتيح لك تشغيل تعبيرات ربط البيانات العشوائية. تتوفّر هذه الميزة مع الإصدار 2.0 والإصدارات الأحدث من المكوّن الإضافي لنظام Gradle المتوافق مع Android Gradle

في مراجع الطرق، يجب أن تتطابق مَعلمات الطريقة مع مَعلمات أداة معالجة الحدث. في عمليات ربط المستمع، يجب أن تتطابق القيمة المعروضة فقط مع القيمة المعروضة المتوقّعة للمستمع، إلا إذا كانت القيمة المتوقّعة void. على سبيل المثال، ضع في الاعتبار فئة المقدِّم التالية التي تحتوي على الطريقة onSaveClick():

Kotlin

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

Java

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

يمكنك ربط حدث النقر بالطريقة onSaveClick() على النحو التالي:

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

عند استخدام استدعاء في تعبير، تنشئ ميزة ربط البيانات تلقائيًا المستمع الضروري ويسجّلها للحدث. عندما تنشط طريقة العرض الحدث، يقيّم ربط البيانات التعبير المحدّد. كما هو الحال مع تعبيرات الربط العادية، تحصل على أمان القيمة الخالية وسلسلة المحادثات أثناء تقييم تعبيرات المستمعين.

في المثال السابق، لم يتم تحديد المعلمة view التي يتم تمريرها إلى onClick(View). توفّر روابط المستمعين خيارَين لمَعلمات المستمع: يمكنك تجاهل جميع المَعلمات باستخدام الطريقة أو تسمية جميع المَعلمات. إذا كنت تفضل تسمية المعلمات، يمكنك استخدامها في تعبيرك. على سبيل المثال، يمكنك كتابة التعبير السابق على النحو التالي:

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

إذا كنت تريد استخدام المعلمة في التعبير، يمكنك إجراء ذلك كما يلي:

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)}"

ويمكنك استخدام تعبير lambda مع أكثر من معلمة واحدة:

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)}" />

إذا عرض الحدث الذي تستمع إليه قيمة ليس نوعها void، يجب أن تعرض التعبيرات نوع القيمة نفسه أيضًا. على سبيل المثال، إذا كنت تريد الاستماع إلى حدث "النقر مع الاستمرار" (النقر مع الاستمرار)، يجب أن يعرض التعبير قيمة منطقية.

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)}"

إذا تعذّر تقييم التعبير بسبب عناصر null، يعرض ربط البيانات القيمة التلقائية لهذا النوع، مثل null لأنواع المراجع، أو 0 للنوع int، أو false للنوع boolean.

إذا كنت بحاجة إلى استخدام تعبير مع إسناد، مثل دالّة ثلاثية، يمكنك استخدام void كرمز:

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

تجنُّب أدوات معالجة البيانات المعقّدة

تعد تعبيرات المستمع قوية ويمكن أن تجعل قراءة التعليمات البرمجية أسهل. من ناحية أخرى، تجعل أجهزة المستمعين التي تحتوي على تعبيرات معقدة أصعب في القراءة والصيانة. اجعل تعبيراتك بسيطة مثل تمرير البيانات المتاحة من واجهة المستخدم إلى طريقة رد الاتصال الخاصة بك. نفِّذ أي منطق عمل داخل طريقة رد الاتصال التي تستدعيها من تعبير المستمع.

عمليات الاستيراد والمتغيّرات والتضمين

توفر مكتبة ربط البيانات ميزات مثل عمليات الاستيراد والمتغيرات والتضمين. تساعد عمليات الاستيراد على تسهيل الرجوع إلى الصفوف داخل ملفات التنسيق. تتيح لك المتغيرات وصف خاصية يمكن استخدامها في التعبيرات المرتبطة. تتيح لك التضمينات إعادة استخدام التنسيقات المعقدة عبر تطبيقك.

الواردات

تتيح لك عمليات الاستيراد الإشارة إلى الفئات داخل ملف التنسيق، كما هو الحال في الرمز المُدار. يمكنك استخدام عدد صفر أو أكثر من عناصر import داخل العنصر data. يستورد مثال الرمز التالي الفئة View إلى ملف التنسيق:

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

يتيح لك استيراد الفئة View الرجوع إليها من تعبيرات الربط. يوضح المثال التالي كيفية الإشارة إلى ثوابت VISIBLE وGONE للفئة View:

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

كتابة الأسماء المستعارة

عندما يكون هناك تعارض في اسم الفئة، يمكنك إعادة تسمية إحدى الفئات إلى اسم مستعار. في المثال التالي، تتم إعادة تسمية الفئة View في حزمة com.example.real.estate إلى Vista:

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

يمكنك بعد ذلك استخدام Vista للإشارة إلى com.example.real.estate.View وView للإشارة إلى android.view.View ضمن ملف التنسيق.

استيراد صفوف أخرى

يمكنك استخدام الأنواع المستوردة كمراجع للأنواع في المتغيرات والتعبيرات. ويوضّح المثال التالي User وList كنوع للمتغيّر:

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

يمكنك استخدام الأنواع التي تم استيرادها لبث جزء من تعبير. يحوِّل المثال التالي السمة connection إلى نوع User:

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

يمكنك أيضًا استخدام الأنواع المستوردة عند الإشارة إلى حقول وطرق ثابتة في التعبيرات. يستورد الرمز التالي الفئة MyStringUtils ويشير إلى طريقة capitalize الخاصة بها:

<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.* تلقائيًا.

المُتغيّرات

يمكنك استخدام عناصر variable متعدّدة داخل العنصر data. يصف كل عنصر variable خاصية يمكن ضبطها على التنسيق لاستخدامها في تعبيرات الربط ضمن ملف التنسيق. يعرِّف المثال التالي المتغيرات user وimage وnote:

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

يتم فحص أنواع المتغيرات في وقت التجميع، وبالتالي إذا كان المتغيّر يستخدم Observable أو كان مجموعة قابلة للملاحظة، يجب أن يظهر ذلك في النوع. إذا كان المتغير هو فئة أساسية أو واجهة لا تنفّذ واجهة Observable، لا تتم ملاحظة المتغيرات.

وعندما تكون هناك ملفات تنسيق مختلفة لعمليات ضبط مختلفة (على سبيل المثال، أفقية أو عمودية)، يتم دمج المتغيرات. يجب ألا يكون هناك تعريفات متغيرات متضاربة بين ملفات التخطيط هذه.

تحتوي فئة الربط التي تم إنشاؤها على دالة setter وgetter لكل من المتغيرات الموصوفة. تستخدم المتغيّرات قيم التعليمات البرمجية المُدارة التلقائية إلى أن يتم استدعاء دالة الضبط: null لأنواع المراجع، و0 لـ int، وfalse لـ boolean، وما إلى ذلك.

يتمّ إنشاء متغيّر خاص باسم context لاستخدامه في تعبيرات الربط حسب الحاجة. قيمة context هي الكائن Context من طريقة العرض الجذر getContext(). يتم إلغاء المتغيّر context من خلال إعلان متغير صريح بهذا الاسم.

بجودة

يمكنك تمرير المتغيرات إلى ربط التنسيق المضمّن من التنسيق الذي يتضمن مساحة اسم التطبيق واسم المتغيّر في سمة. يُظهر المثال التالي متغيّرات user المضمّنة من ملفات التنسيق name.xml وcontact.xml:

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

لا يتيح ربط البيانات إمكانية التضمين كعنصر ثانوي مباشر لعنصر الدمج. على سبيل المثال، التنسيق التالي غير متاح:

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

مراجع إضافية

لمعرفة المزيد حول ربط البيانات، راجع الموارد الإضافية التالية.

عيّنات

الدروس التطبيقية حول الترميز

مشاركات المدونة