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

حالا که دو پیاده‌سازی از TabHelper و CompatTab دارید - یکی برای اندروید ۳.۰ و بالاتر و یکی برای نسخه‌های قبلی پلتفرم - وقت آن رسیده که با این پیاده‌سازی‌ها کاری انجام دهید. این درس در مورد ایجاد منطق برای جابجایی بین این پیاده‌سازی‌ها، ایجاد طرح‌بندی‌های آگاه از نسخه و در نهایت استفاده از کامپوننت رابط کاربری سازگار با نسخه‌های قبلی بحث می‌کند.

منطق سوئیچینگ را اضافه کنید

کلاس انتزاعی 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" />

در زمان اجرا، اندروید بسته به نسخه پلتفرم، تصمیم می‌گیرد که کدام نسخه از طرح‌بندی main.xml را inflate کند. این همان منطقی است که در بخش قبلی برای تعیین اینکه از کدام پیاده‌سازی TabHelper استفاده شود، نشان داده شد.

از TabHelper در اکتیویتی خود استفاده کنید

در متد onCreate() مربوط به activity خود، می‌توانید یک شیء 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);
}

هنگام اجرای برنامه، این کد طرح‌بندی صحیح activity را inflate می‌کند و یک شیء TabHelperHoneycomb یا TabHelperEclair را نمونه‌سازی می‌کند. کلاس concrete که در واقع استفاده می‌شود برای activity مبهم است، زیرا آنها رابط TabHelper مشترکی را به اشتراک می‌گذارند.

دو تصویر زیر، اجرای این پیاده‌سازی را روی دستگاه‌های اندروید ۲.۳ و اندروید ۴.۰ نشان می‌دهد.

مثالی از تب‌های در حال اجرا روی دستگاه اندروید ۲.۳ (با استفاده از TabHelperEclair).
نمونه‌ای از تب‌های در حال اجرا روی دستگاه اندروید ۴.۰ (با استفاده از TabHelperHoneycomb).

شکل ۱. نمونه‌هایی از اسکرین‌شات‌های تب‌های سازگار با نسخه‌های قبلی که روی یک دستگاه اندروید ۲.۳ (با استفاده از TabHelperEclair ) و یک دستگاه اندروید ۴.۰ (با استفاده از TabHelperHoneycomb ) اجرا می‌شوند.