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

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

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

کلاس انتزاعی 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 را به اشتراک می گذارند.

در زیر دو اسکرین شات از این پیاده سازی در حال اجرا بر روی دستگاه اندروید 2.3 و اندروید 4.0 را مشاهده می کنید.

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

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