वर्शन अवेयर कॉम्पोनेंट का इस्तेमाल करें

अब आपके पास 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 का इस्तेमाल करके).

पहली इमेज. यहां पीछे के वर्शन के साथ काम करने वाले टैब के स्क्रीनशॉट दिए गए हैं. इनमें Android 2.3 डिवाइस पर TabHelperEclair और Android 4.0 डिवाइस पर TabHelperHoneycomb का इस्तेमाल किया गया है.