ভার্সন-অ্যাওয়ার কম্পোনেন্ট ব্যবহার করুন

এখন আপনার কাছে TabHelper এবং CompatTab-এর দুটি ইমপ্লিমেন্টেশন আছে—একটি Android 3.0 এবং তার পরবর্তী ভার্সনের জন্য এবং অন্যটি প্ল্যাটফর্মের আগের ভার্সনের জন্য—এখন এই ইমপ্লিমেন্টেশনগুলি নিয়ে কিছু করার সময় এসেছে। এই পাঠে এইসব ইমপ্লিমেন্টেশনের মধ্যে পরিবর্তন করার জন্য লজিক তৈরি করা, ভার্সন-অ্যাওয়ার লেআউট তৈরি করা এবং অবশেষে ব্যাকওয়ার্ড কম্প্যাটিবল UI কম্পোনেন্ট ব্যবহার করার বিষয়ে আলোচনা করা হয়েছে।

সুইচিং লজিক যোগ করুন

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

জাভা

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

জাভা

@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 ব্যবহার করে) ব্যাকওয়ার্ড কম্প্যাটিবল ট্যাবের স্ক্রিনশটের উদাহরণ।