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

والآن بعد أن أصبح لديك عمليتَا تنفيذ لكل من 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/format-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)