يوضِّح لك هذا الدرس كيفية وضع فئات فرعية للفئة المجرّدة CompatTab
وTabHelper
واستخدام واجهات برمجة تطبيقات جديدة. يمكن لتطبيقك استخدام هذا التنفيذ على الأجهزة التي تعمل بإصدار من النظام الأساسي يتيح ذلك.
تنفيذ علامات التبويب باستخدام واجهات برمجة التطبيقات الجديدة
إنّ الفئات المحددة لكلّ من CompatTab
وTabHelper
التي تستخدم واجهات برمجة تطبيقات أحدث هي خادم وكيل. بما أنّ الفئات المجردة المحدّدة في الدرس السابق تعكس واجهات برمجة التطبيقات الجديدة (بنية الفئة، وتوقيعات الطرق، وما إلى ذلك)، فإنّ الفئات المحدّدة التي تستخدم واجهات برمجة التطبيقات الأحدث تُمثّل ببساطة طلبات استدعاء الطرق ونتائجها.
يمكنك استخدام واجهات برمجة التطبيقات الأحدث مباشرةً في هذه الفئات المحدّدة، ولن يؤدي ذلك إلى حدوث أعطال على الأجهزة القديمة، وذلك بسبب تحميل الفئات بشكلٍ غير فوري. يتم تحميل الفصول وإعدادها عند أول وصول إليها، وذلك عن طريق إنشاء مثيل للفصل أو الوصول إلى أحد الحقول أو الطرق الثابتة فيه للمرة الأولى. ولهذا السبب، لن تنشئ Dalvik VM أي استثناءات VerifyError
طالما أنّك لا تنشئ مثيلاً لعمليات التنفيذ الخاصة بـ Honeycomb على الأجهزة السابقة لـ Honeycomb.
من الممارسات الجيدة في عملية التنفيذ هذه إلحاق اسم رمز مستوى واجهة برمجة التطبيقات أو الإصدار الأساسي بالمنصة بما يتوافق مع واجهات برمجة التطبيقات المطلوبة من الفئات الملموسة. على سبيل المثال، يمكن أن توفّر الصفوف 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. }