بعد أن أصبح لديك تنفيذان لـ TabHelper
وCompatTab
، أحدهما لنظام التشغيل Android 3.0 والإصدارات الأحدث والآخر للإصدارات الأقدم من المنصة، حان وقت اتّخاذ إجراء بشأن هذين التنفيذَين. يناقش هذا الدرس إنشاء منطق للتبديل بين طرق التنفيذ هذه، وإنشاء تخطيطات الوعي بالإصدارات، وأخيرًا استخدام مكوِّن واجهة المستخدم المتوافق مع الإصدارات القديمة.
إضافة منطق التبديل
تعمل فئة المحتوى التجريدي "TabHelper
" بمثابة مصنع لإنشاء مثيلين "TabHelper
" و"CompatTab
" مناسبين للإصدار، استنادًا إلى إصدار النظام الأساسي للجهاز الحالي:
Kotlin
sealed class TabHelper(protected val mActivity: FragmentActivity, protected val tag: String) { abstract fun setUp() abstract fun addTab(tab: CompatTab) // Usage is tabHelper.newTab("tag") fun newTab(tag: String): CompatTab = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { CompatTabHoneycomb(mActivity, tag) } else { CompatTabEclair(mActivity, tag) } companion object { // Usage is TabHelper.createInstance(activity) fun createInstance(activity: FragmentActivity): TabHelper = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { TabHelperHoneycomb(activity) } else { TabHelperEclair(activity) } } }
Java
public abstract class TabHelper { ... // Usage is TabHelper.createInstance(activity) public static TabHelper createInstance(FragmentActivity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { return new TabHelperHoneycomb(activity); } else { return new TabHelperEclair(activity); } } // Usage is tabHelper.newTab("tag") public CompatTab newTab(String tag) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { return new CompatTabHoneycomb(mActivity, tag); } else { return new CompatTabEclair(mActivity, tag); } } ... }
إنشاء تنسيق نشاط يراعي الإصدار
الخطوة التالية هي توفير تخطيطات لنشاطك يمكنها دعم عمليات تنفيذ علامتي التبويب. بالنسبة إلى طريقة التنفيذ القديمة (TabHelperEclair
)، عليك التأكّد من أنّ تنسيق النشاط يحتوي على TabWidget
وTabHost
، إلى جانب حاوية لمحتوى علامة التبويب:
res/layout/main.xml:
<!-- This layout is for API level 5-10 only. --> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp"> <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> </TabHost>
لتنفيذ TabHelperHoneycomb
، ما عليك سوى استخدام FrameLayout
لتضمين محتوى علامة التبويب، لأنّ مؤشرات علامات التبويب يوفّرها ActionBar
:
res/layout-v11/main.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" />
أثناء التشغيل، سيحدِّد Android إصدار تنسيق main.xml
الذي سيتم توسيعه استنادًا إلى إصدار النظام الأساسي. هذا هو المنطق نفسه الذي تم عرضه في القسم السابق لتحديد آلية تنفيذ TabHelper
التي يجب استخدامها.
استخدام TabHelper في نشاطك
في طريقة onCreate()
لنشاطك، يمكنك الحصول على كائن TabHelper
وإضافة علامات تبويب بالرمز التالي:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... setContentView(R.layout.main) TabHelper.createInstance(this).apply { setUp() newTab("photos") .setText(R.string.tab_photos) .also { photosTab -> addTab(photosTab) } newTab("videos") .setText(R.string.tab_videos) .also { videosTab -> addTab(videosTab) } } }
Java
@Override public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.main); TabHelper tabHelper = TabHelper.createInstance(this); tabHelper.setUp(); CompatTab photosTab = tabHelper .newTab("photos") .setText(R.string.tab_photos); tabHelper.addTab(photosTab); CompatTab videosTab = tabHelper .newTab("videos") .setText(R.string.tab_videos); tabHelper.addTab(videosTab); }
عند تشغيل التطبيق، يعمل هذا الرمز على تضخيم تنسيق النشاط الصحيح وإنشاء مثيل لعنصر TabHelperHoneycomb
أو TabHelperEclair
. الفئة الملموسة المستخدمة بالفعل غير معتمة للنشاط، لأنها تشترك في واجهة TabHelper
المشتركة.
في ما يلي لقطةَا شاشة لهذا التنفيذ على جهازَي Android 2.3 وAndroid 4.0.