এই টিউটোরিয়ালে আলোচনা করা হয়েছে যে কীভাবে এমন একটি ইমপ্লিমেন্টেশন তৈরি করা যায় যা নতুন API-এর মতো কাজ করে এবং পুরনো ডিভাইসেও কাজ করে।
বিকল্প সমাধান বেছে নিন
ব্যাকওয়ার্ড কম্প্যাটিবল উপায়ে নতুন UI ফিচার ব্যবহার করার ক্ষেত্রে সবচেয়ে চ্যালেঞ্জিং কাজ হল পুরনো প্ল্যাটফর্ম ভার্সনের জন্য পুরনো (ফলব্যাক) সমাধান নির্ধারণ ও প্রয়োগ করা। অনেক ক্ষেত্রে, পুরনো UI ফ্রেমওয়ার্ক ফিচার ব্যবহার করে এইসব নতুন UI কম্পোনেন্টের উদ্দেশ্য পূরণ করা সম্ভব। যেমন:
-
অ্যাকশন বার অনুভূমিক
LinearLayoutব্যবহার করে প্রয়োগ করা যেতে পারে, যাতে ইমেজ বোতাম থাকে, হয় কাস্টম টাইটেল বার হিসেবে অথবা আপনার অ্যাক্টিভিটি লেআউটে ভিউ হিসেবে। ডিভাইসের মেনু বোতামের মধ্যে ওভারফ্লো অ্যাকশন দেখানো যেতে পারে। -
অ্যাকশন বার ট্যাব, বোতাম সহ অনুভূমিক
LinearLayoutবাTabWidgetUI এলিমেন্ট ব্যবহার করে প্রয়োগ করা যেতে পারে। -
NumberPickerএবংSwitchউইজেট যথাক্রমেSpinnerএবংToggleButtonউইজেট ব্যবহার করে প্রয়োগ করা যেতে পারে। -
ListPopupWindowএবংPopupMenuউইজেটPopupWindowউইজেট ব্যবহার করে প্রয়োগ করা যেতে পারে।
পুরনো ডিভাইসে নতুন UI কম্পোনেন্ট ব্যাকপোর্ট করার জন্য সাধারণত কোনও একটি নির্দিষ্ট সমাধান নেই। ব্যবহারকারীর অভিজ্ঞতার ব্যাপারে সচেতন থাকুন: পুরনো ডিভাইসে, ব্যবহারকারীরা নতুন ডিজাইন প্যাটার্ন এবং UI কম্পোনেন্টের সাথে পরিচিত নাও হতে পারেন। পরিচিত এলিমেন্ট ব্যবহার করে কীভাবে একই কার্যকারিতা প্রদান করা যায় সেই বিষয়ে চিন্তা করুন। অনেক ক্ষেত্রে এটি নিয়ে চিন্তা করার প্রয়োজন নেই—যদি নতুন UI কম্পোনেন্ট অ্যাপ্লিকেশন ইকোসিস্টেমে (যেমন অ্যাকশন বার) বিশিষ্ট হয় অথবা যেখানে ইন্টার্যাকশন মডেলটি বেসিক ও স্বজ্ঞাত (যেমন ViewPager ব্যবহার করে সোয়াইপ ভিউ)।
পুরনো API ব্যবহার করে ট্যাব প্রয়োগ করা
অ্যাকশন বার ট্যাবের পুরনো ইমপ্লিমেন্টেশন তৈরি করতে, আপনি TabWidget এবং TabHost ব্যবহার করতে পারেন (যদিও বিকল্প হিসেবে অনুভূমিকভাবে সাজানো Button উইজেট ব্যবহার করা যেতে পারে)। TabHelperEclair এবং CompatTabEclair নামক ক্লাসে এটি প্রয়োগ করুন, কারণ এই প্রয়োগে এমন API ব্যবহার করা হয় যা Android 2.0 (Eclair)-এর পরে আর ব্যবহার করা হয়নি।
CompatTabEclair ইমপ্লিমেন্টেশন, ইনস্ট্যান্স ভেরিয়েবলে ট্যাব টেক্সট ও আইকনের মতো ট্যাব প্রপার্টি স্টোর করে, কারণ এই স্টোরেজ ম্যানেজ করার জন্য কোনও ActionBar.Tab অবজেক্ট উপলভ্য নেই:
Kotlin
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 উইজেটে পদ্ধতি ব্যবহার করে TabHost.TabSpec অবজেক্ট ও ট্যাব ইন্ডিকেটর তৈরি করে:
Kotlin
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-এর দুটি ইমপ্লিমেন্টেশন আছে: একটি যা Android 3.0 বা তার পরবর্তী ভার্সন চলা ডিভাইসে কাজ করে এবং নতুন API ব্যবহার করে এবং অন্যটি যা Android 2.0 বা তার পরবর্তী ভার্সন চলা ডিভাইসে কাজ করে এবং পুরনো API ব্যবহার করে। পরবর্তী পাঠে আপনার অ্যাপ্লিকেশনে এইসব ইমপ্লিমেন্টেশন ব্যবহার করার বিষয়ে আলোচনা করা হয়েছে।