يوضّح لك هذا الدرس كيفية إنشاء فئات فرعية من الفئتين المجرّدتين CompatTab وTabHelper واستخدام واجهات برمجة التطبيقات الجديدة. يمكن لتطبيقك استخدام هذا التنفيذ على الأجهزة التي تعمل بإصدار منصة يتيح استخدامها.
تنفيذ علامات التبويب باستخدام واجهات برمجة التطبيقات الجديدة
إنّ الفئات الملموسة لـ CompatTab وTabHelper التي تستخدم واجهات برمجة التطبيقات الأحدث هي تنفيذ وكيل. بما أنّ الفئات المجرّدة المحدّدة في الدرس السابق تعكس واجهات برمجة التطبيقات الجديدة (بنية الفئة وتوقيعات الطريقة وما إلى ذلك)، فإنّ الفئات الملموسة التي تستخدم واجهات برمجة التطبيقات الأحدث هذه توجّه طلبات الطريقة ونتائجها.
يمكنك استخدام واجهات برمجة التطبيقات الأحدث مباشرةً في هذه الفئات الملموسة بدون أن يتعطّل التطبيق على الأجهزة القديمة بسبب التحميل الكسول للفئة. يتم تحميل الفئات وتهيئتها عند الوصول إليها لأول مرة، أي عند إنشاء مثيل للفئة أو الوصول إلى أحد حقولها أو طرقها الثابتة للمرة الأولى. وبالتالي، طالما أنّك لا تنشئ مثيلاً للتنفيذات الخاصة بإصدار Honeycomb على الأجهزة التي تعمل بإصدارات أقدم من Honeycomb، لن يطرح جهاز Dalvik VM أي استثناءات VerifyError.
من أفضل اصطلاحات التسمية لهذا التنفيذ إلحاق مستوى واجهة برمجة التطبيقات أو اسم رمز إصدار المنصة الذي يتوافق مع واجهات برمجة التطبيقات التي تتطلبها الفئات الملموسة. على سبيل المثال، يمكن أن توفّر الفئتان CompatTabHoneycomb وTabHelperHoneycomb تنفيذ علامة التبويب الأصلية، لأنّهما تعتمدان على واجهات برمجة التطبيقات المتاحة في Android 3.0 (مستوى واجهة برمجة التطبيقات 11) أو الإصدارات الأحدث.
تنفيذ CompatTabHoneycomb
CompatTabHoneycomb هو تنفيذ للفئة المجرّدة CompatTab التي تستخدمها TabHelperHoneycomb للإشارة إلى علامات التبويب الفردية. توجّه CompatTabHoneycomb جميع طلبات الطريقة إلى كائن ActionBar.Tab الذي تحتويه.
ابدأ بتنفيذ CompatTabHoneycomb باستخدام واجهات برمجة التطبيقات الجديدة ActionBar.Tab:
Kotlin
class CompatTabHoneycomb internal constructor(val activity: Activity, tag: String) : CompatTab(tag) { ... // The native tab object that this CompatTab acts as a proxy for. private var mTab: ActionBar.Tab = // Proxy to new ActionBar.newTab API activity.actionBar.newTab() override fun setText(@StringRes textId: Int): CompatTab { // Proxy to new ActionBar.Tab.setText API mTab.setText(textId) return this } ... // Do the same for other properties (icon, callback, etc.) }
Java
public class CompatTabHoneycomb extends CompatTab { // The native tab object that this CompatTab acts as a proxy for. ActionBar.Tab mTab; ... protected CompatTabHoneycomb(FragmentActivity activity, String tag) { ... // Proxy to new ActionBar.newTab API mTab = activity.getActionBar().newTab(); } public CompatTab setText(int resId) { // Proxy to new ActionBar.Tab.setText API mTab.setText(resId); return this; } ... // Do the same for other properties (icon, callback, etc.) }
تنفيذ TabHelperHoneycomb
TabHelperHoneycomb هو تنفيذ للفئة المجرّدة TabHelper التي توجّه طلبات الطريقة إلى ActionBar فعلي تم الحصول عليه من Activity الذي تحتويه.
نفِّذ TabHelperHoneycomb، مع توجيه طلبات الطريقة إلى واجهة برمجة التطبيقات ActionBar:
Kotlin
class TabHelperHoneycomb internal constructor(activity: FragmentActivity) : TabHelper(activity) { private var mActionBar: ActionBar? = null override fun setUp() { mActionBar = mActionBar ?: mActivity.actionBar.apply { navigationMode = ActionBar.NAVIGATION_MODE_TABS } } override fun addTab(tab: CompatTab) { // Tab is a CompatTabHoneycomb instance, so its // native tab object is an ActionBar.Tab. mActionBar?.addTab(tab.getTab() as ActionBar.Tab) } }
Java
public class TabHelperHoneycomb extends TabHelper { ActionBar actionBar; ... protected void setUp() { if (actionBar == null) { actionBar = activity.getActionBar(); actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_TABS); } } public void addTab(CompatTab tab) { ... // Tab is a CompatTabHoneycomb instance, so its // native tab object is an ActionBar.Tab. actionBar.addTab((ActionBar.Tab) tab.getTab()); } // The other important method, newTab() is part of // the base implementation. }