لنفترض أنك تريد استخدام علامات تبويب شريط الإجراءات كنموذج أساسي للتنقّل على المستوى الأعلى في تطبيقك. لا تتوفّر واجهات برمجة التطبيقات ActionBar
إلا في الإصدار Android 3.0 أو الإصدارات الأحدث (المستوى 11 والإصدارات الأحدث من واجهة برمجة التطبيقات). وبالتالي، إذا أردت توزيع تطبيقك على أجهزة تعمل بإصدارات سابقة من النظام الأساسي، عليك توفير طريقة تنفيذ تتوافق مع واجهة برمجة التطبيقات الأحدث مع توفير آلية احتياطية تستخدم واجهات برمجة تطبيقات قديمة.
وفي هذه الفئة، يمكنك إنشاء عنصر واجهة مستخدم ذات علامات تبويب يستخدم الفئات المجرّدة مع عمليات تنفيذ خاصة بإصدار معيّن لتوفير توافق مع الإصدارات القديمة. يشرح هذا الدرس كيفية إنشاء طبقة تجريدية لواجهات برمجة التطبيقات لعلامة التبويب الجديدة كخطوة أولى نحو إنشاء عنصر علامة التبويب.
الاستعداد للتجريد
يتضمّن التجريد في لغة برمجة Java إنشاء واجهة أو أكثر من الواجهات أو فئة مجردة لإخفاء تفاصيل التنفيذ. في حال توفُّر واجهات برمجة تطبيقات Android جديدة، يمكن استخدام التجريد لإنشاء مكوّنات الوعي بالإصدارات والتي تستخدم واجهات برمجة التطبيقات الحالية على الأجهزة الأحدث، والرجوع إلى واجهات برمجة التطبيقات القديمة والأكثر توافقًا على الأجهزة القديمة.
وعند استخدام هذا المنهج، عليك أولاً تحديد الفئات الجديدة التي تريد التمكّن من استخدامها بطريقة متوافقة مع الأنظمة القديمة، ثم إنشاء فئات مجردة تستند إلى الواجهات العامة للفئات الحديثة. عند تحديد واجهات التجريد، يجب إنشاء نسخة مطابقة من واجهة برمجة التطبيقات الجديدة بقدر الإمكان. ويؤدي ذلك إلى زيادة التوافق الأمامي، كما يسهل حذف طبقة التجريد في المستقبل عندما لا تكون ضرورية.
بعد إنشاء فئات مجردة لواجهات برمجة التطبيقات الجديدة هذه، يمكن إنشاء أي عدد من عمليات التنفيذ واختياره في وقت التشغيل. لأغراض التوافق مع الأنظمة القديمة، يمكن أن تختلف عمليات التنفيذ هذه حسب مستوى واجهة برمجة التطبيقات المطلوب. وبالتالي، قد تستخدم إحدى عمليات التنفيذ واجهات برمجة التطبيقات التي تم إصدارها مؤخرًا، بينما يمكن للعمليات الأخرى استخدام واجهات برمجة تطبيقات قديمة.
إنشاء واجهة تجريدية لعلامة تبويب
لإنشاء إصدار متوافق مع الإصدارات القديمة من علامات التبويب، يجب أولاً تحديد الميزات وواجهات برمجة التطبيقات التي يتطلبها تطبيقك. في حالة علامات تبويب أقسام المستوى الأعلى، لنفترض أن لديك المتطلبات الوظيفية التالية:
- يجب أن تعرض مؤشرات علامة التبويب نصًا ورمزًا.
- يمكن ربط علامات التبويب بمثيل مجزّأ.
- ومن المفترض أن يتمكّن النشاط من رصد التغييرات في علامة التبويب.
يتيح لك إعداد هذه المتطلبات مسبقًا التحكم في نطاق طبقة التجريد. وهذا يعني أنك ستقضي وقتًا أقل في إنشاء عمليات تنفيذ متعددة لطبقة التجريد، وبدء استخدام التنفيذ الجديد المتوافق مع الأنظمة القديمة في وقت أقرب.
تتوفر واجهات برمجة التطبيقات الرئيسية لعلامات التبويب في ActionBar
وActionBar.Tab
. هذه هي واجهات برمجة التطبيقات التي يجب استخلاصها لجعل علامات التبويب متوافقة مع الإصدارات. تطلب متطلبات هذا المثال للمشروع عدم التوافق مرة أخرى مع Eclair (المستوى 5 من واجهة برمجة التطبيقات) مع الاستفادة من ميزات علامات التبويب الجديدة في Honeycomb (مستوى واجهة برمجة التطبيقات 11). يظهر أدناه مخطّط بياني لبنية الفئة لدعم عمليتي التنفيذ وفئاتهما الأساسية المجردة (أو واجهتهما).
![يشير ذلك المصطلح إلى رسم بياني لفئة يحتوي على فئات أساسية تجريدية وعمليات تنفيذ خاصة بإصدار معيّن.](https://developer.android.com/static/images/training/backward-compatible-ui-classes.png?authuser=9&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
بشكل يتوافق مع إصداري المنصة القديم والأحدث.