الصفوف الدراسية المُنشأة

تنشئ "مكتبة ربط البيانات" فئات ربط يمكنك استخدامها للوصول إلى متغيرات التخطيط وطرق العرض. توضح هذه الوثائق كيفية إنشاء وتخصيص فئات الربط التي تم إنشاؤها.

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

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

إنشاء كائن ربط

يتم إنشاء كائن الربط فورًا بعد تضخيم التنسيق للتأكّد من عدم تعديل التسلسل الهرمي لطريقة العرض قبل ربطه بطرق العرض ذات التعبيرات داخل التنسيق. الطريقة الأكثر شيوعًا لربط الكائن بتخطيط هي استخدام الطرق الثابتة في فئة الربط. يمكنك تضخيم التسلسل الهرمي لطريقة العرض وربط الكائن به باستخدام طريقة inflate() لفئة الربط، كما هو موضّح في المثال التالي:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater)

    setContentView(binding.root)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());

    setContentView(binding.root);
}

هناك نسخة بديلة من الطريقة inflate() تستخدم الكائن ViewGroup بالإضافة إلى الكائن LayoutInflater كما هو موضّح في المثال التالي:

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)

Java

MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);

إذا تم تضخم التخطيط باستخدام آلية مختلفة، يمكنك ربطه بشكل منفصل، على النحو التالي:

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)

Java

MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);

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

Kotlin

val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent)
val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)

Java

View viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent);
ViewDataBinding binding = DataBindingUtil.bind(viewRoot);

إذا كنت تستخدم عناصر ربط البيانات داخل معدِّل 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);

الملفّات الشخصية المرتبطة بالأرقام التعريفية

تنشئ "مكتبة ربط البيانات" حقلاً غير قابل للتغيير في فئة الربط لكل ملف شخصي يحتوي على معرّف في التنسيق. على سبيل المثال، تُنشئ "مكتبة ربط البيانات" الحقلين firstName وlastName من النوع TextView من التنسيق التالي:

<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}"
   android:id="@+id/firstName"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"
  android:id="@+id/lastName"/>
   </LinearLayout>
</layout>

تستخرج المكتبة طرق العرض، بما في ذلك أرقام التعريف، من التسلسل الهرمي للملفات الشخصية في بطاقة واحدة. ويمكن أن تكون هذه الآلية أسرع من استدعاء الطريقة findViewById() لكل طريقة عرض في التنسيق.

لا تُعدّ المعرّفات ضرورية كما هي بدون ربط البيانات، ولكن لا تزال هناك بعض الحالات التي يكون فيها الوصول إلى الملفات الشخصية ضروريًا من خلال الرمز البرمجي.

المُتغيّرات

تنشئ "مكتبة ربط البيانات" طرق موصّل لكل متغير تم تعريفه في التخطيط. على سبيل المثال، يُنشئ التنسيق التالي طريقتي setter وgetter في فئة الربط للمتغيرات 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>

رموز العرض

على عكس طرق العرض العادية، تبدأ عناصر ViewStub كطرق عرض غير مرئية. عندما يتم جعلها مرئية أو يتم تضخيمها بشكل واضح، تستبدل نفسها في التخطيط من خلال تضخيم تخطيط آخر.

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

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

الربط الفوري

عندما يتغير متغير أو عنصر يمكن ملاحظته، تتم جدولة الربط لتغييره قبل الإطار التالي. ومع ذلك، هناك أوقات يجب فيها تنفيذ الربط فورًا. ولفرض التنفيذ، استخدِم طريقة executePendingBindings().

المتغيرات الديناميكية

في بعض الأحيان، تكون فئة الربط المحددة غير معروفة. على سبيل المثال، لا يتعرّف عامل التشغيل RecyclerView.Adapter على التنسيقات العشوائية على فئة الربط المحدّدة. يجب أن يخصّص قيمة الربط أثناء الاستدعاء إلى الطريقة onBindViewHolder().

في المثال التالي، جميع التنسيقات التي تربطها دالة RecyclerView لتكون متغيّر item. يحتوي الكائن BindingHolder على طريقة getBinding() التي تعرض الفئة ViewDataBinding الأساسية.

Kotlin

override fun onBindViewHolder(holder: BindingHolder, position: Int) {
    item: T = items.get(position)
    holder.binding.setVariable(BR.item, item);
    holder.binding.executePendingBindings();
}

Java

public void onBindViewHolder(BindingHolder holder, int position) {
    final T item = items.get(position);
    holder.getBinding().setVariable(BR.item, item);
    holder.getBinding().executePendingBindings();
}

سلسلة محادثات في الخلفية

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

أسماء فئات الربط المخصّصة

بشكل تلقائي، يتم إنشاء فئة ربط استنادًا إلى اسم ملف التنسيق، بدءًا بحرف كبير وإزالة الشرطات السفلية ( _ ) و استخدام الحرف التالي بحرف كبير ثم إضافة لاحقة إلى كلمة تجليد. على سبيل المثال، ينشئ ملف التنسيق contact_item.xml الفئة ContactItemBinding. يتم وضع الفئة في حزمة databinding ضمن حزمة الوحدة. على سبيل المثال، إذا كانت حزمة الوحدة هي com.example.my.app، يتم وضع فئة الربط في الحزمة com.example.my.app.databinding.

يمكن إعادة تسمية فئات الربط أو وضعها في حِزم مختلفة من خلال تعديل السمة class للعنصر data. على سبيل المثال، ينشئ التنسيق التالي فئة الربط ContactItem في حزمة databinding ضمن الوحدة الحالية:

<data class="ContactItem">
    ...
</data>

يمكنك إنشاء فئة الربط في حزمة مختلفة من خلال إضافة نقطة بادئة لاسم الفئة. ينشئ المثال التالي فئة الربط في حزمة الوحدة:

<data class=".ContactItem">
    ...
</data>

يمكنك أيضًا استخدام اسم الحزمة الكامل الذي تريد إنشاء فئة الربط فيه. ينشئ المثال التالي فئة الربط ContactItem في حزمة com.example:

<data class="com.example.ContactItem">
    ...
</data>

مراجع إضافية

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