استفاده از مؤلفه آگاه از نسخه

اکنون که دو پیاده‌سازی از TabHelper و CompatTab دارید (یکی برای Android نسخه ۳.۰ و بالاتر و دیگری برای نسخه‌های قبلی پلاتفرم)، وقت آن است که با این پیاده‌سازی‌ها کاری انجام دهید. این درس به ایجاد منطق برای جابه‌جایی بین این پیاده‌سازی‌ها، ایجاد چیدمان‌های آگاه از نسخه، و درنهایت استفاده از مؤلفه میانای کاربری سازگار با نسخه‌های قدیمی می‌پردازد.

افزودن منطق تعویض

کلاس انتزاعی TabHelper به‌عنوان یک کارخانه برای ایجاد نمونه‌های TabHelper و CompatTab مناسب نسخه، براساس نسخه پلاتفرم دستگاه فعلی عمل می‌کند:

کاتلین

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)
                }
    }
}

جاوا

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 را دریافت کنید و با کد زیر برگه‌ها را اضافه کنید:

کاتلین

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)
                }
    }
}

جاوا

@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).

شکل ۱. نماگرفت‌های نمونه از برگه‌های سازگار با نسخه قدیمی که در دستگاه Android 2.3 (بااستفاده از TabHelperEclair) و دستگاه Android 4.0 (بااستفاده از TabHelperHoneycomb) اجرا می‌شوند.