পুরানো এপিআইগুলির সাথে একটি বাস্তবায়ন তৈরি করুন

এই পাঠে আলোচনা করা হয়েছে কীভাবে এমন একটি ইমপ্লিমেন্টেশন তৈরি করা যায় যা নতুন এপিআই-গুলোর অনুরূপ হওয়ার পাশাপাশি পুরোনো ডিভাইসগুলোকেও সমর্থন করে।

একটি বিকল্প সমাধান স্থির করুন।

ব্যাকওয়ার্ড-কম্প্যাটিবল পদ্ধতিতে নতুন UI ফিচার ব্যবহার করার ক্ষেত্রে সবচেয়ে কঠিন কাজটি হলো পুরোনো প্ল্যাটফর্ম সংস্করণগুলোর জন্য একটি পুরোনো (ফলব্যাক) সমাধান নির্ধারণ ও বাস্তবায়ন করা। অনেক ক্ষেত্রে, পুরোনো UI ফ্রেমওয়ার্কের ফিচার ব্যবহার করেই এই নতুন UI কম্পোনেন্টগুলোর উদ্দেশ্য পূরণ করা সম্ভব। উদাহরণস্বরূপ:

  • কাস্টম টাইটেল বার হিসেবে অথবা আপনার অ্যাক্টিভিটি লেআউটের ভিউ হিসেবে ইমেজ বাটন সম্বলিত একটি হরাইজন্টাল LinearLayout ব্যবহার করে অ্যাকশন বার তৈরি করা যায়। ওভারফ্লো অ্যাকশনগুলো ডিভাইস মেনু বাটনের নিচে উপস্থাপন করা যেতে পারে।

  • বাটন সম্বলিত একটি হরাইজন্টাল LinearLayout ব্যবহার করে, অথবা TabWidget UI এলিমেন্ট ব্যবহার করে অ্যাকশন বার ট্যাবগুলো বাস্তবায়ন করা যায়।

  • NumberPicker এবং Switch উইজেট যথাক্রমে Spinner এবং ToggleButton উইজেট ব্যবহার করে বাস্তবায়ন করা যায়।

  • PopupWindow উইজেট ব্যবহার করে ListPopupWindow এবং PopupMenu উইজেটগুলো বাস্তবায়ন করা যায়।

পুরোনো ডিভাইসে নতুন UI কম্পোনেন্ট ব্যাকপোর্ট করার জন্য সাধারণত কোনো সর্বজনীন সমাধান নেই। ব্যবহারকারীর অভিজ্ঞতার কথা মাথায় রাখুন: পুরোনো ডিভাইসে, ব্যবহারকারীরা নতুন ডিজাইন প্যাটার্ন এবং UI কম্পোনেন্টের সাথে পরিচিত নাও থাকতে পারেন। পরিচিত উপাদান ব্যবহার করে কীভাবে একই কার্যকারিতা প্রদান করা যায়, সে বিষয়ে ভেবে দেখুন। অনেক ক্ষেত্রে এটি ততটা উদ্বেগের বিষয় নয়—যদি নতুন UI কম্পোনেন্টগুলো অ্যাপ্লিকেশন ইকোসিস্টেমে সুস্পষ্ট থাকে (যেমন অ্যাকশন বার), অথবা যেখানে ইন্টারঅ্যাকশন মডেলটি মৌলিক এবং স্বজ্ঞাত হয় (যেমন ViewPager ব্যবহার করে সোয়াইপ ভিউ)।

পুরানো এপিআই ব্যবহার করে ট্যাব বাস্তবায়ন করুন

অ্যাকশন বার ট্যাবের একটি পুরোনো সংস্করণ তৈরি করতে, আপনি TabWidget এবং TabHost ব্যবহার করতে পারেন (যদিও এর বিকল্প হিসেবে হরাইজন্টালি বিন্যস্ত Button উইজেটও ব্যবহার করা যায়)। TabHelperEclair এবং CompatTabEclair নামক ক্লাসগুলিতে এটি প্রয়োগ করুন, কারণ এই ইমপ্লিমেন্টেশনটি Android 2.0 (Eclair)-এর আগে প্রবর্তিত API ব্যবহার করে।

Eclair-এ ট্যাব বাস্তবায়নের ক্লাস ডায়াগ্রাম।
চিত্র ১. Eclair-এ ট্যাব বাস্তবায়নের ক্লাস ডায়াগ্রাম।

CompatTabEclair ইমপ্লিমেন্টেশনটি ট্যাবের টেক্সট এবং আইকনের মতো ট্যাব প্রোপার্টিগুলোকে ইনস্ট্যান্স ভেরিয়েবলে সংরক্ষণ করে, কারণ এই স্টোরেজটি পরিচালনা করার জন্য কোনো ActionBar.Tab অবজেক্ট উপলব্ধ নেই:

কোটলিন

class CompatTabEclair internal constructor(val activity: FragmentActivity, tag: String) :
        CompatTab(tag) {

    // Store these properties in the instance,
    // as there is no ActionBar.Tab object.
    private var text: CharSequence? = null
    ...

    override fun setText(resId: Int): CompatTab {
        // Our older implementation simply stores this
        // information in the object instance.
        text = activity.resources.getText(resId)
        return this
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

জাভা

public class CompatTabEclair extends CompatTab {
    // Store these properties in the instance,
    // as there is no ActionBar.Tab object.
    private CharSequence text;
    ...

    public CompatTab setText(int resId) {
        // Our older implementation simply stores this
        // information in the object instance.
        text = activity.getResources().getText(resId);
        return this;
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

TabHelperEclair ইমপ্লিমেন্টেশনটি TabHost.TabSpec অবজেক্ট এবং ট্যাব ইন্ডিকেটর তৈরি করার জন্য TabHost উইজেটের মেথডগুলো ব্যবহার করে:

কোটলিন

class TabHelperEclair internal constructor(activity: FragmentActivity) : TabHelper(activity) {

    private var tabHost: TabHost? = null
    ...

    override fun setUp() {
        // Our activity layout for pre-Honeycomb devices
        // must contain a TabHost.
        tabHost = tabHost ?: mActivity.findViewById<TabHost>(android.R.id.tabhost).apply {
            setup()
        }
    }

    override fun addTab(tab: CompatTab) {
        ...
        tabHost?.newTabSpec(tab.tag)?.run {
            setIndicator(tab.getText()) // And optional icon
            ...
            tabHost?.addTab(this)
        }
    }
    // The other important method, newTab() is part of
    // the base implementation.
}

জাভা

public class TabHelperEclair extends TabHelper {
    private TabHost tabHost;
    ...

    protected void setUp() {
        if (tabHost == null) {
            // Our activity layout for pre-Honeycomb devices
            // must contain a TabHost.
            tabHost = (TabHost) mActivity.findViewById(
                    android.R.id.tabhost);
            tabHost.setup();
        }
    }

    public void addTab(CompatTab tab) {
        ...
        TabSpec spec = tabHost
                .newTabSpec(tag)
                .setIndicator(tab.getText()); // And optional icon
        ...
        tabHost.addTab(spec);
    }

    // The other important method, newTab() is part of
    // the base implementation.
}

এখন আপনার কাছে CompatTab এবং TabHelper এর দুটি ইমপ্লিমেন্টেশন রয়েছে: একটি যা অ্যান্ড্রয়েড ৩.০ বা তার পরবর্তী সংস্করণের ডিভাইসে কাজ করে এবং নতুন এপিআই ব্যবহার করে, এবং অন্যটি যা অ্যান্ড্রয়েড ২.০ বা তার পরবর্তী সংস্করণের ডিভাইসে কাজ করে এবং পুরোনো এপিআই ব্যবহার করে। পরবর্তী পাঠে আপনার অ্যাপ্লিকেশনে এই ইমপ্লিমেন্টেশনগুলো কীভাবে ব্যবহার করবেন তা আলোচনা করা হবে।