تتيح لك لغة التعبير كتابة التعبيرات التي تتعامل مع الأحداث المرسلة حسب المشاهدات تنشئ مكتبة ربط البيانات الفئات المطلوبة تلقائيًا لربط طرق العرض في التخطيط بكائنات البيانات.
تختلف ملفات تخطيط ربط البيانات قليلاً وتبدأ بعلامة جذر
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);
لغة التعبير
الميزات الشائعة
تشبه لغة التعبير إلى حد كبير التعبيرات التي تم العثور عليها في التعليمات البرمجية المُدارة. إِنْتَ يمكن استخدام عوامل التشغيل والكلمات الرئيسية التالية في لغة التعبير:
- رياضي:
+ - / * %
- دمج السلاسل:
+
- المنطقي:
&& ||
- برنامج ثنائي:
& | ^
- أحادي:
+ - ! ~
- 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
فارغة، وتم تعيين القيمة التلقائية لـ user.name
هي null
. إذا كنت
المرجع 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)}"
تتطلب بعض الموارد تقييمًا صريحًا للنوع، كما هو موضح في ما يلي: :
النوع | المرجع العادي | مرجع التعبير |
---|---|---|
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
إلى
في نشاط ما. وهناك ميزة واحدة مقارنة
View
onClick
هي أنّ
التعبير عن المعالجة في وقت التجميع. لذلك، إذا لم تكن الطريقة موجودة أو كانت
التوقيع غير صحيح، ستتلقى خطأ وقت التجميع.
يتمثل الاختلاف الرئيسي بين مراجع الطريقة وروابط المستمعين في أن يتم إنشاء تنفيذ المستمع الفعلي عندما يتم ربط البيانات، وليس عندما . إذا كنت تفضّل تقييم التعبير عندما يكون الحدث استخدام روابط المستمعين.
لتعيين حدث للمعالج الخاص به، استخدِم تعبير ربط عادي، مع وهي اسم الطريقة المراد استدعاءها. على سبيل المثال، ضع في الاعتبار المثال التالي كائن بيانات التخطيط:
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>
عمليات ربط المستمع
عمليات ربط المستمعين هي تعبيرات ربط يتم تشغيلها عند وقوع حدث. هم تشبه مراجع الأساليب، ولكنّها تتيح لك تنفيذ ربط بيانات عشوائي والتعبيرات. تتوفّر هذه الميزة مع مكوّن Gradle الإضافي لنظام Gradle المتوافق مع Android الإصدار 2.0 والإصدارات الأحدث.
في مراجع الطريقة، يجب أن تتطابق معلَمات الطريقة مع معلَمات
مستمع الحدث. في عمليات ربط المستمعين، يجب أن تتطابق القيمة المعروضة فقط مع
القيمة المعروضة المتوقعة للمستماع، ما لم يكن يتوقع 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 لكلٍ من
المتغيرات. تأخذ المتغيرات القيم التلقائية للرمز المُدار حتى أداة setter
يسمى—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>
مصادر إضافية
لمعرفة المزيد حول ربط البيانات، راجع الموارد الإضافية التالية.