لنفترض أنك تريد استخدام علامات تبويب شريط الإجراءات كشكل أساسي للتنقّل على المستوى الأعلى في تطبيقك. للأسف، لا تتوفّر واجهات برمجة التطبيقات ActionBar
إلا في الإصدار Android 3.0 أو الإصدارات الأحدث (المستوى 11 من واجهة برمجة التطبيقات والإصدارات الأحدث). وبالتالي، إذا كنت تريد توزيع تطبيقك على الأجهزة التي تعمل بإصدارات سابقة من النظام الأساسي، عليك توفير عملية تنفيذ تتوافق مع واجهة برمجة التطبيقات الأحدث مع توفير آلية احتياطية تستخدم واجهات برمجة تطبيقات قديمة.
ستنشئ في هذه الفئة مكوّنًا لواجهة مستخدم مبوَّبة يستخدم فئات مجرّدة مع عمليات تنفيذ خاصة بإصدار معيّن لتوفير التوافق مع الأنظمة القديمة. يصف هذا الدرس كيفية إنشاء طبقة تجريد لواجهات برمجة التطبيقات لعلامة التبويب الجديدة كخطوة أولى نحو إنشاء مكوِّن علامة التبويب.
الاستعداد للتجريد
يتضمن التجريد في لغة البرمجة Java إنشاء واجهة واحدة أو أكثر أو فئات مجردة لإخفاء تفاصيل التنفيذ. في حالة واجهات برمجة تطبيقات Android الأحدث، يمكنك استخدام التجريد لإنشاء مكوّنات حسب الإصدار تستخدم واجهات برمجة التطبيقات الحالية على الأجهزة الأحدث، والرجوع إلى واجهات برمجة التطبيقات الأقدم والأكثر توافقًا على الأجهزة القديمة.
عند استخدام هذا المنهج، عليك أولاً تحديد الفئات الجديدة التي تريد أن تكون قادرًا على استخدامها بطريقة متوافقة مع الأنظمة القديمة، ثم إنشاء فئات مجردة استنادًا إلى الواجهات العامة للفئات الجديدة. عند تحديد واجهات التجريد، يجب أن تعكس واجهة برمجة التطبيقات الأحدث قدر الإمكان. ويؤدي ذلك إلى زيادة التوافق مع الأمام وتسهيل إسقاط طبقة التجريد في المستقبل عندما لا تكون هناك حاجة لاستخدامها بعد الآن.
بعد إنشاء فئات مجرّدة لواجهات برمجة التطبيقات الجديدة هذه، يمكن إنشاء أي عدد من عمليات التنفيذ واختيارها في وقت التشغيل. ولأغراض التوافق مع الأنظمة القديمة، يمكن أن تختلف عمليات التنفيذ هذه حسب مستوى واجهة برمجة التطبيقات المطلوب. وبالتالي، قد تستخدم إحدى عمليات التنفيذ واجهات برمجة تطبيقات تم إصدارها مؤخرًا، في حين يمكن للآخرين استخدام واجهات برمجة تطبيقات أقدم.
إنشاء واجهة علامة تبويب تجريدية
لإنشاء إصدار متوافق من علامات التبويب مع الأنظمة القديمة، يجب أولاً تحديد الميزات وواجهات برمجة التطبيقات المحددة التي يتطلبها تطبيقك. في حالة علامات تبويب الأقسام ذات المستوى الأعلى، لنفترض أنّ لديك المتطلبات الوظيفية التالية:
- يجب أن تعرض مؤشرات علامات التبويب نصًا ورمزًا.
- يمكن أن ترتبط علامات التبويب بمثيل جزء.
- يجب أن يتمكن النشاط من الاستماع إلى التغييرات في علامات التبويب.
يتيح لك إعداد هذه المتطلبات مقدمًا التحكم في نطاق طبقة التجريد الخاصة بك. وهذا يعني أنك ستقضي وقتًا أقل في إنشاء عمليات تنفيذ متعددة لطبقة التجريد والبدء في استخدام التنفيذ الجديد المتوافق مع الأنظمة القديمة في وقت أقرب.
تتوفّر واجهات برمجة التطبيقات الرئيسية لعلامات التبويب باللغتَين ActionBar
وActionBar.Tab
. هذه هي واجهات برمجة التطبيقات التي يجب استخراجها لتصبح علامات التبويب متوافقة مع الإصدار. تتطلب متطلبات هذا المثال على المشروع التوافق مرة أخرى مع Eclair (المستوى 5 لواجهة برمجة التطبيقات) مع الاستفادة من ميزات علامة التبويب الجديدة في Honeycomb (المستوى 11 من واجهة برمجة التطبيقات). وفي ما يلي رسم تخطيطي لهيكل الفئة لدعم هذين التطبيقين وفئات الأساس التجريدية (أو الواجهات) الخاصة بهما.
![رسم تخطيطي للفئات الأساسية المجرّدة والتطبيقات الخاصة بإصدار معيّن.](https://developer.android.google.cn/static/images/training/backward-compatible-ui-classes.png?authuser=8&hl=ar)
الشكل 1. رسم تخطيطي للفئات الأساسية المجرّدة والتطبيقات الخاصة بإصدار معيّن.
علامة تبويب ActionBar.Tab مجردة
يمكنك البدء في إنشاء طبقة تجريد علامات التبويب من خلال إنشاء فئة مجردة تمثل علامة تبويب تعكس واجهة ActionBar.Tab
:
Kotlin
sealed class CompatTab(val tag: String) { ... abstract fun getText(): CharSequence abstract fun getIcon(): Drawable abstract fun getCallback(): CompatTabListener abstract fun getFragment(): Fragment abstract fun setText(text: String): CompatTab abstract fun setIcon(icon: Drawable): CompatTab abstract fun setCallback(callback: CompatTabListener): CompatTab abstract fun setFragment(fragment: Fragment): CompatTab ... }
Java
public abstract class CompatTab { ... public abstract CompatTab setText(int resId); public abstract CompatTab setIcon(int resId); public abstract CompatTab setTabListener( CompatTabListener callback); public abstract CompatTab setFragment(Fragment fragment); public abstract CharSequence getText(); public abstract Drawable getIcon(); public abstract CompatTabListener getCallback(); public abstract Fragment getFragment(); ... }
يمكنك استخدام فئة مجردة بدلاً من واجهة هنا لتبسيط تنفيذ الميزات الشائعة مثل ربط كائنات علامة التبويب بالأنشطة (لا يظهر في مقتطف الرمز).
أساليب مجردة لعلامة تبويب ActionBar
بعد ذلك، حدِّد فئة مجردة تسمح لك بإنشاء علامات تبويب وإضافتها إلى نشاط، مثل ActionBar.newTab()
وActionBar.addTab()
:
Kotlin
sealed class TabHelper(protected val activity: FragmentActivity) { ... abstract fun setUp() fun newTab(tag: String): CompatTab { // This method is implemented in a later lesson. } abstract fun addTab(tab: CompatTab) ... }
Java
public abstract class TabHelper { ... public CompatTab newTab(String tag) { // This method is implemented in a later lesson. } public abstract void addTab(CompatTab tab); ... }
في الدروس التالية، ستنشئ عمليات تنفيذ لـ TabHelper
وCompatTab
تعمل على كلا الإصدارين القديم والحديث من النظام الأساسي.