استخدام المكوِّن الإضافي للإصدار

بعد أن أصبح لديك تنفيذان لـ 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.

مثال على لقطة شاشة لعلامات التبويب التي تعمل على جهاز Android 2.3 (باستخدام TabHelperEclair) أمثلة على لقطات شاشة لعلامات التبويب التي تعمل على جهاز Android 4.0 (باستخدام TabHelperHoneycomb)

الشكل 1: مثال على لقطات شاشة علامات التبويب المتوافقة مع الإصدارات القديمة التي تعمل على جهاز Android 2.3 (باستخدام TabHelperEclair) وجهاز Android 4.0 (باستخدام TabHelperHoneycomb).