تتيح لك لغة التعبير كتابة التعبيرات التي تتعامل مع الأحداث المُرسلة بواسطة طرق العرض. تنشئ "مكتبة ربط البيانات" تلقائيًا الفئات المطلوبة لربط طرق العرض في التخطيط بكائنات البيانات.
تختلف ملفات تنسيق ربط البيانات قليلاً وتبدأ بعلامة جذر 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:
>> >>> <<
- المقارنة:
== > < >= <=
(يجب تخطي<
باعتبارها<
) 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<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<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<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>
مراجع إضافية
لمعرفة المزيد حول ربط البيانات، راجع الموارد الإضافية التالية.