عرض الربط جزء من Android Jetpack.

ربط طريقة العرض هو ميزة تسهِّل كتابة التعليمات البرمجية التي تتفاعل مع طرق العرض. عند تفعيل ربط العرض في وحدة معيّنة، تُنشئ فئة ربط لكل ملف تنسيق XML موجود في هذه الوحدة. يحتوي مثيل الفئة المُلزِمة على إشارات مباشرة إلى جميع الملفات الشخصية التي تحتوي على معرِّف في التنسيق المقابل.

في معظم الحالات، يحل ربط طريقة العرض محل findViewById.

ضبط إعدادات

تم تفعيل ربط العرض على أساس كل وحدة على حدة. لتفعيل ربط العرض في وحدة، يمكنك ضبط خيار الإصدار viewBinding على true في ملف build.gradle على مستوى الوحدة، كما هو موضّح في المثال التالي:

رائع

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

Kotlin

android {
    ...
    buildFeatures {
        viewBinding = true
    }
}

إذا أردت أن يتم تجاهل ملف تنسيق أثناء إنشاء فئات ربط، أضِف السمة tools:viewBindingIgnore="true" إلى طريقة العرض الجذر لملف التنسيق هذا:

<LinearLayout
        ...
        tools:viewBindingIgnore="true" >
    ...
</LinearLayout>

الاستخدام

إذا تم تمكين ربط العرض لوحدة ما، فسيتم إنشاء فئة ربط لكل ملف تخطيط XML تحتوي عليه الوحدة. تحتوي كل فئة ربط على مراجع للعرض الجذر وجميع الملفات الشخصية التي تحتوي على معرّف. يتم إنشاء اسم فئة الربط عن طريق تحويل اسم ملف XML إلى حالة Pascal وإضافة كلمة "الربط" في النهاية.

على سبيل المثال، يمكنك استخدام ملف تنسيق يُسمى result_profile.xml يحتوي على ما يلي:

<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>

تُسمى فئة الربط التي يتم إنشاؤها ResultProfileBinding. وتتضمّن هذه الفئة حقلَين: TextView يُسمى name والأخرى Button باسم button. لا يتضمّن ImageView في التنسيق معرّفًا، لذلك لا تتوفّر مرجع إليه في فئة الربط.

تتضمن كل فئة ربط أيضًا طريقة getRoot()، ما يوفّر مرجعًا مباشرًا للعرض الجذر لملف التنسيق المقابل. في هذا المثال، تعرض الطريقة getRoot() في الفئة ResultProfileBinding طريقة العرض الجذر LinearLayout.

توضح الأقسام التالية استخدام فئات ملزمة تم إنشاؤها في الأنشطة والأجزاء.

استخدام ربط العرض في الأنشطة

لإعداد مثيل لفئة الربط لاستخدامها مع نشاط ما، نفِّذ الخطوات التالية في طريقة onCreate() الخاصة بالنشاط:

  1. عليك استدعاء طريقة inflate() الثابتة المضمّنة في فئة الربط التي تم إنشاؤها. يُنشئ هذا مثيلاً لفئة الربط للنشاط المراد استخدامه.
  2. احصل على مرجع إلى العرض الجذر عن طريق استدعاء طريقة getRoot() أو باستخدام بنية سمة Kotlin.
  3. مرِّر العرض الجذر إلى setContentView() لجعله العرض النشط على الشاشة.

يتم عرض هذه الخطوات في المثال التالي:

Kotlin

private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}

Java

private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}

يمكنك الآن استخدام مثيل فئة الربط للإشارة إلى أي من طرق العرض:

Kotlin

binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }

Java

binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

استخدام ربط العرض في الأجزاء

لإعداد مثيل لفئة الربط لاستخدامها مع كسر، نفِّذ الخطوات التالية في طريقة onCreateView() للجزء:

  1. عليك استدعاء طريقة inflate() الثابتة المضمّنة في فئة الربط التي تم إنشاؤها. يُنشئ هذا مثيلاً لفئة الربط للجزء المراد استخدامه.
  2. احصل على مرجع إلى العرض الجذر عن طريق استدعاء طريقة getRoot() أو باستخدام بنية سمة Kotlin.
  3. ارجِع طريقة العرض الجذر من طريقة onCreateView() لجعلها العرض النشط على الشاشة.

Kotlin

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

Java

private ResultProfileBinding binding;

@Override
public View onCreateView (LayoutInflater inflater,
                          ViewGroup container,
                          Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

يمكنك الآن استخدام مثيل فئة الربط للإشارة إلى أي من طرق العرض:

Kotlin

binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }

Java

binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

تقديم تلميحات حول الإعدادات المختلفة

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

# in res/layout/example.xml

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml

<EditText android:id="@+id/user_bio" />

في هذه الحالة، يمكنك أن تتوقّع أن تعرض الفئة التي تم إنشاؤها الحقل userBio من النوع TextView، لأنّ TextView هي الفئة الأساسية الشائعة. بسبب القيود الفنية، لا يمكن لأداة إنشاء رمز ربط طرق العرض تحديد ذلك وإنشاء حقل View بدلاً من ذلك. يتطلّب هذا الإجراء بث محتوى الحقل لاحقًا باستخدام "binding.userBio as TextView".

وللتغلب على هذا القيد، يتيح ربط طريقة العرض استخدام سمة tools:viewBindingType، ما يتيح لك إعلام المحوِّل البرمجي بالنوع الذي يجب استخدامه في الرمز الذي تم إنشاؤه. في المثال السابق، يمكنك استخدام هذه السمة لجعل المحوِّل البرمجي ينشئ الحقل على أنّه TextView:

# in res/layout/example.xml (unchanged)

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml

<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />

في مثال آخر، لنفترض أنّ لديك تنسيقَين، أحدهما يحتوي على BottomNavigationView والآخر يتضمّن NavigationRailView. تعمل كلتا الفئتَين على توسيع نطاق NavigationBarView الذي يحتوي على معظم تفاصيل التنفيذ. إذا كان الرمز البرمجي لا يحتاج إلى معرفة الفئة الفرعية المتوفّرة في التنسيق الحالي، يمكنك استخدام tools:viewBindingType لضبط النوع الذي يتم إنشاؤه على NavigationBarView في كلا التنسيقَين:

# in res/layout/navigation_example.xml

<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />

# in res/layout-w720/navigation_example.xml

<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />

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

  • يجب أن تكون القيمة فئة تكتسبها من android.view.View.
  • يجب أن تكون القيمة فئة رئيسية للعلامة الموضوعة عليها. على سبيل المثال، لا تعمل القيم التالية:

      <TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. -->
      <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
    
  • يجب أن يتم ضبط النوع النهائي بشكل متّسق في جميع عمليات الضبط.

الاختلافات مع findViewById

يتميّز ربط الملف الشخصي بمزايا مهمة لا تتيح استخدام findViewById:

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

تعني هذه الاختلافات عدم التوافق بين التنسيق والرمز البرمجي الذي يؤدي إلى إخفاق الإصدار في وقت التجميع بدلاً من وقت التشغيل.

مقارنة مع ربط البيانات

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

  • تجميع أسرع: لا يتطلّب ربط طريقة العرض أي معالجة للتعليقات التوضيحية، لذا تكون أوقات تجميع البيانات أسرع.
  • سهولة الاستخدام: لا تتطلّب ميزة ربط طريقة العرض ملفات تنسيق XML التي تم وضع علامات خاصة عليها، وبالتالي يمكنك استخدامها بشكل أسرع في تطبيقاتك. بمجرد تمكينك ربط العرض في وحدة ما، يتم تطبيقه على جميع تخطيطات تلك الوحدة تلقائيًا.

من ناحية أخرى، تنطبق القيود التالية على ربط طريقة العرض مقارنةً بربط البيانات:

بسبب هذه الاعتبارات، في بعض الحالات، من الأفضل استخدام كل من ربط طريقة العرض وربط البيانات في مشروع ما. يمكنك استخدام ربط البيانات في التخطيطات التي تتطلب ميزات متقدمة واستخدام ربط العرض في التخطيطات التي لا تتطلب ذلك.

مراجع إضافية

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

عيّنات

المدوّنات

الفيديوهات الطويلة