تنشئ "مكتبة ربط البيانات" فئات ربط يمكنك استخدامها للوصول إلى متغيرات التخطيط وطرق العرض. توضح هذه الوثائق كيفية إنشاء وتخصيص فئات الربط التي تم إنشاؤها.
تربط فئة الربط التي تم إنشاؤها متغيرات التخطيط بطرق العرض داخل التخطيط. يمكنك تخصيص اسم
وحزمة الربط. يتم اكتساب جميع فئات الربط التي تم إنشاؤها من الفئة
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>
مراجع إضافية
لمعرفة المزيد من المعلومات عن ربط البيانات، اطّلِع على المراجع الإضافية التالية.
أفلام مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عند إيقاف JavaScript.
- التنسيقات وتعبيرات الربط
- مكتبة ربط البيانات
- عرض الربط