المخططات وتعبيرات الربط

الإعلانات

المخططات وتعبيرات الربط

 

 

 

المخططات وتعبيرات الربط

 

تسمح لك لغة التعبير بكتابة تعبيرات تعالج الأحداث المرسلة من خلال طرق العرض “المعاينات”.

تقوم مكتبة ربط البيانات تلقائياً بإنشاء الفئات المطلوبة لربط المعاينات في المخطط مع كائنات البيانات الخاصة بك.

ملفات مخطط ربط البيانات، مختلفة قليلاً وتبدأ بالوسم الأساسي للمخطط، متبوعاً بعنصر بيانات وعنصر أساسي للعرض.

عنصر العرض هذا، هو ما سيكون عليه الأساس الخاص بك، في ملف مخطط غير مرتبط. يعرض الكود التالي نموذج ملف مخطط: 

متغير المستخدم بداخل البيانات يوضح خاصية يمكن إستخدامها داخل هذا المخطط.

 

التعبيرات بداخل المخطط تتم كتابتها في خصائص السمة بإستخدام بناء الجملة “{}@“. هنا، يتم تعيين النص TextView لخاصية الأسم الأول firstName لمتغير المستخدم:

ملاحظة: يجب أن تبقى تعبيرات المخطط صغيرة وبسيطة، بحيث لا يمكن أن تكون مجموعة مختبره و لديها دعم محدود من IDE.

لتبسيط تعبيرات المخطط، يمكنك إستخدام محولات الربط المخصصة.

 

 

 

 

 

 

المخططات وتعبيرات الربط

 

 

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


لنفترض الآن أن لديك كائن قديم جداً يقوم بوصف كيان المستخدم:

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

يحتوي هذا النوع من الكائنات على بيانات لا تتغير أبداً. من الشائع في التطبيقات الحصول على بيانات تتم قراءتها مرة واحدة ولا تتغير أبداً بعد ذلك.

 

 

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

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 في حالة وجود تلك الداله.

 

 

 

 

 

 

 

المخططات وتعبيرات الربط

 

بيانات الربط


يتم إنشاء فئة ربط لكل ملف مخطط. بشكلٍ إفتراضي، أسم الفئة يرتكز على أسم ملف المخطط..

وتحويله إلى حالة باسكال وإضافة لاحقة الربط إليه. أسم ملف المخطط أعلاه هو activity_main.xml ..

بحيث تكون الفئة المطابقة التي تم تكوينها هي ActivityMainBinding. تحتوي هذه الفئة على كل الروابط من خصائص المخطط..

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

الطريقة الموصى بها لإنشاء الروابط، هي القيام بها أثناء تضخيم المخطط، كما هو موضح في المثال التالي:

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

 

إذا كنت تستخدم عناصر ربط البيانات داخل محول الشظايا أو عرض القائمة أو 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);

 

 

 

 

 

المخططات وتعبيرات الربط

 

لغة التعبير


السمات المشتركة

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

 

  • العمليات الحسابيه 
  • تسلسل السلاسل +
  • المنطقي || &&
  • الثنائي ^ | & 
  • الأحادي ~ ! - +
  • التحويل >> <<< <<
  • المقارنات => =<  >  <  ==
  • instanceof
  • التجميع ()
  • Literals – character، String، numeric، null
  • Cast
  • إستدعاء الدوال
  • الوصول للحقول
  • الوصول للمصفوفات []
  • المشغل الثلاثي :?

مثال:

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

 

 

 

مرجع الخاصيه

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

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

 

 

تجنب إستثناءات المؤشر الفارغة

كود ربط البيانات المُنشئه يتحقق تلقائياً من القيم الخالية ويتجنب إستثناءات المؤشر الفارغة null. على سبيل المثال..

 في التعبير {user.name}@ ، إذا كان المستخدم user فارغ، يقوم اسم المستخدم user.name بتعيين القيمة الإفتراضية الفارغة الخاصة به.

إذا كنت تشير إلى عمر المستخدم user.age، حيث يكون العمر من نوع عدد صحيح int ، فإن ربط البيانات يستخدم القيمة الإفتراضية 0.

 

 

المجموعات

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

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

 

ملاحظة: لكي يكون XML صحيحاً، يجب عليك تخطي الرمز >. مثال: بدلاً من <List<String يجب عليك كتابة <List&lt;String .

يمكنك أيضاً الإشارة إلى قيمة في الخريطة بإستخدام الرموز 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)}"

عندما تأخذ صيغة الجمع عدة معاملات، يجب تمرير جميع المعاملات:

  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 لتجنب حدوث تعارض.

 

يمكنك إستخدام السمات التالية لتجنب هذا النوع من التعارضات:

 

الفئه Listener setter ضبط المستمع السمه
SearchView

عرض البحث

(setOnSearchClickListener(View.OnClickListener android:onSearchClick
ZoomControls

التحكم في التكبير

(setOnZoomInClickListener(View.OnClickListener android:onZoomIn
ZoomControls (setOnZoomOutClickListener(View.OnClickListener android:onZoomOut

يمكنك إستخدام الآليات التالية للتعامل مع الحدث:

 

  •  الإشارة إلى الدوال: في تعبيراتك، يمكنك الإشارة إلى الدوال التي تتوافق مع توقيع دالة المستمع.

عندما يتم تقييم التعبير إلى إشارة الداله، يقوم ربط البيانات بلف الإشارة إلى الدالة والكائن الذي تملكه في المستمع..

وتعيين ذلك المستمع في طريقة العرض المستهدفه. إذا تم تقييم التعبير إلى فارغ، لا يقوم ربط البيانات بإنشاء مستمع ويعين مستمع فارغ بدلاً من ذلك.

 

  •  روابط المستمع: هذه عبارة عن تعبيرات لامبدا التي يتم تقييمها عند حدوث الحدث.

ربط البيانات ينشئ دائماً المستمع، الذي يتم تعيينه في طريقة العرض. عندما يتم إرسال الحدث، يقوم المستمع بتقييم تعبير لامبدا.

 

 

 

 

المخططات وتعبيرات الربط

 

الإشارة إلى الدوال

يمكن ربط الأحداث بدوال المعالج مباشرة، بشكلٍ مشابه للطريقة التي يمكن بها تعيين android:onClick إلى دالة في أحد الأنشطة.

تتمثل إحدى الميزات الرئيسية مقارنةً بسمة العرض 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 للنسخة 2.0 والإصدارات الأحدث.

في الإشارة إلى الدوال، يجب أن تتطابق معاملات الدالة مع معاملات مستمع الحدث. في روابط المستمع..

فقط القيمة المرجعه يجب أن تتطابق مع قيمة الإرجاع المتوقعة للمستمع (ما لم يكن التوقع خالي).

على سبيل المثال، خذ بعين الإعتبار فئة المقدم التالية التي تحتوي على دالة ()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>

 

عند إستخدام إستدعاء في تعبير، ينشئ ربط البيانات تلقائياً المستمع اللازم ويسجله للحدث. عند قيام المعاينه بإطلاق الحدث..

يقوم ربط البيانات بتقييم التعبير المحدد. كما هو الحال في تعبيرات الربط العادية، لا تزال تحصل على..

فارغ وتسلسل آمن لربط البيانات أثناء تقييم تعبيرات المستمع هذه.

في المثال أعلاه، لم نقم بتعريف باراميتر العرض الذي يتم تمريره إلى (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)}"

 

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

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

 

إذا كان الحدث الذي تستمع إليه، يعرض قيمة، لا يكون نوعها خالياً، فيجب أن تعيد تعبيراتك نفس نوع القيمة أيضاً.

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

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 بداخل عنصر البيانات. الكود التالي عبارة عن مثال على إستيراد فئة العرض View إلى ملف المخطط:

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

 

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

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

 

 

 

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

عند وجود تعارضات في اسم فئة، قد تتم إعادة تسمية إحدى الفئات إلى اسم مستعار.

يقوم المثال التالي بإعادة تسمية فئة عرض في حزمة 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>

 

تنبيه: لا يتعامل أندرويد ستوديو حتى الآن مع الإستيراد، لذلك قد لا يعمل الإكمال التلقائي للمتغيرات المستوردة في IDE.

ما زال تطبيقك يتم تجميعه برمجياً ويمكنك التعامل مع مشكلة IDE بإستخدام أسماء مؤهلة بالكامل في تعريفات المتغير الخاص بك.

 

يمكنك أيضاً إستخدام الأنواع المستوردة للإدلاء بجزء من التعبير. المثال التالي يدلي بخاصية الإتصال 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، فلن يتم ملاحظة المتغيرات.

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

فئة الربط المنشئه لديها setter و getter لكل من المتغيرات الموصوفة. تأخذ المتغيرات القيم الإفتراضية للكود المدار..

إلى أن يتم إستدعاء setter – فارغ null لأنواع المراجع، و 0 للعدد الصحيح int ، وخطأ false للقيمة المنطقيه boolean، إلخ.

يتم إنشاء متغير خاص بأسم السياق context للإستخدام في التعبيرات المرتبطه حسب الحاجة.

قيمة السياق هي كائن Context من دالة ()getContext لطريقة العرض الأساسيه. يتم تجاوز متغير السياق بواسطة إعلان متغير صريح بذلك الأسم.

 

 

التضمين

قد يتم تمرير المتغيرات إلى إرتباط المخطط المضمن من المخطط المحتوي بإستخدام نطاق التطبيق وأسم المتغير في سمة.

يعرض المثال التالي متغيرات المستخدم 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>

 

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات

اترك رد