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

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

تختلف ملفات تخطيط ربط البيانات قليلاً وتبدأ بعلامة جذر 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: >> >>> <<
  • مقارنة: == > < >= <= (يجب تخطي < باعتباره &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 فارغة، وتم تعيين القيمة التلقائية لـ 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&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)}"

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

النوع المرجع العادي مرجع التعبير
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&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 لكلٍ من المتغيرات. تأخذ المتغيرات القيم التلقائية للرمز المُدار حتى أداة 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>

مصادر إضافية

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

نماذج

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

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