ধরুন, আপনি নিজের অ্যাপ্লিকেশনে টপ-লেভেল নেভিগেশনের প্রাথমিক ফর্ম হিসেবে অ্যাকশন বার ট্যাব ব্যবহার করতে চান। দুর্ভাগ্যবশত, ActionBar API শুধুমাত্র Android 3.0 বা তার পরবর্তী ভার্সনে (API লেভেল ১১+) উপলভ্য। তাই, আপনি যদি প্ল্যাটফর্মের আগের ভার্সনে চলা ডিভাইসে আপনার অ্যাপ্লিকেশন ডিস্ট্রিবিউট করতে চান, তাহলে আপনাকে এমন একটি ইমপ্লিমেন্টেশন প্রদান করতে হবে যা পুরনো API ব্যবহার করে এমন একটি ফলব্যাক মেকানিজম প্রদান করার পাশাপাশি নতুন API-কে সাপোর্ট করে।
এই ক্লাসে, আপনি একটি ট্যাব করা ইউজার ইন্টারফেস (UI) কম্পোনেন্ট তৈরি করবেন যা ব্যাকওয়ার্ড কম্প্যাটিবিলিটি প্রদান করার জন্য ভার্সন-নির্দিষ্ট ইমপ্লিমেন্টেশন সহ অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করে। ট্যাব কম্পোনেন্ট তৈরির প্রথম ধাপ হিসেবে নতুন ট্যাব API-এর জন্য কীভাবে অ্যাবস্ট্রাকশন লেয়ার তৈরি করতে হয় তা এই টিউটোরিয়ালে বর্ণনা করা হয়েছে।
অ্যাবস্ট্র্যাকশনের জন্য প্রস্তুত হন
Java প্রোগ্রামিং ল্যাঙ্গুয়েজে অ্যাবস্ট্রাকশন-এর মধ্যে এক বা একাধিক ইন্টারফেস বা অ্যাবস্ট্রাক্ট ক্লাস তৈরি করা হয় যাতে ইমপ্লিমেন্টেশনের বিবরণ লুকানো যায়। নতুন Android API-এর ক্ষেত্রে, আপনি ভার্সন-অ্যাওয়ার কম্পোনেন্ট তৈরি করতে অ্যাবস্ট্রাকশন ব্যবহার করতে পারেন যা নতুন ডিভাইসে বর্তমান API ব্যবহার করে এবং পুরনো ডিভাইসে পুরনো, আরও মানানসই API-তে ফিরে যায়।
এই পদ্ধতি ব্যবহার করার সময়, আপনি প্রথমে নির্ধারণ করেন যে ব্যাকওয়ার্ড কম্প্যাটিবল উপায়ে কোন নতুন ক্লাস ব্যবহার করতে চান, তারপর নতুন ক্লাসের পাবলিক ইন্টারফেসের উপর ভিত্তি করে অ্যাবস্ট্রাক্ট ক্লাস তৈরি করেন। অ্যাবস্ট্রাকশন ইন্টারফেস সংজ্ঞায়িত করার সময়, আপনাকে যতটা সম্ভব নতুন API-এর মতো করে তৈরি করতে হবে। এটি ফরওয়ার্ড-কম্প্যাটিবিলিটি সর্বাধিক করে এবং ভবিষ্যতে অ্যাবস্ট্রাকশন লেয়ারের আর প্রয়োজন না থাকলে সেটি বাদ দেওয়া সহজ করে তোলে।
এইসব নতুন API-এর জন্য অ্যাবস্ট্রাক্ট ক্লাস তৈরি করার পরে, রানটাইমে যেকোনও সংখ্যক ইমপ্লিমেন্টেশন তৈরি ও বেছে নেওয়া যেতে পারে। ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য, প্রয়োজনীয় API লেভেল অনুযায়ী এই প্রয়োগ আলাদা হতে পারে। তাই, একটি ইমপ্লিমেন্টেশন সম্প্রতি রিলিজ হওয়া API ব্যবহার করতে পারে, আবার অন্যগুলি পুরনো API ব্যবহার করতে পারে।
একটি অ্যাবস্ট্র্যাক্ট ট্যাব ইন্টারফেস তৈরি করো
ট্যাবের ব্যাকওয়ার্ড কম্প্যাটিবল ভার্সন তৈরি করতে, আপনার অ্যাপ্লিকেশনের জন্য কোন কোন ফিচার ও নির্দিষ্ট API প্রয়োজন তা প্রথমে নির্ধারণ করতে হবে। টপ-লেভেল বিভাগ ট্যাবের ক্ষেত্রে, ধরুন আপনার নিম্নলিখিত ফাংশনাল প্রয়োজনীয়তা আছে:
- ট্যাব ইন্ডিকেটরে টেক্সট ও আইকন দেখানো উচিত।
- ট্যাব ফ্র্যাগমেন্ট ইনস্ট্যান্সের সাথে যুক্ত করা যেতে পারে।
- অ্যাক্টিভিটি যেন ট্যাব পরিবর্তন শুনতে পায়।
এইসব প্রয়োজনীয়তা আগে থেকে প্রস্তুত করে রাখলে, আপনি অ্যাবস্ট্রাকশন লেয়ারের স্কোপ নিয়ন্ত্রণ করতে পারবেন। এর অর্থ হল, আপনার অ্যাবস্ট্রাকশন লেয়ারের একাধিক ইমপ্লিমেন্টেশন তৈরি করতে আপনাকে কম সময় ব্যয় করতে হবে এবং আপনি আরও দ্রুত আপনার নতুন ব্যাকওয়ার্ড কম্প্যাটিবল ইমপ্লিমেন্টেশন ব্যবহার করা শুরু করতে পারবেন।
ট্যাবের জন্য মূল API ActionBar এবং ActionBar.Tab-এ আছে। আপনার ট্যাবকে ভার্সন-অ্যাওয়ার করার জন্য এইসব API অ্যাবস্ট্র্যাক্ট করতে হবে। এই উদাহরণ প্রোজেক্টের জন্য Honeycomb (API লেভেল ১১)-এ নতুন ট্যাব ফিচারের সুবিধা নেওয়ার পাশাপাশি Eclair (API লেভেল ৫) পর্যন্ত মানানসই হতে হবে। এই দুটি ইমপ্লিমেন্টেশন ও তাদের অ্যাবস্ট্র্যাক্ট বেস ক্লাস (বা ইন্টারফেস) সাপোর্ট করার জন্য ক্লাস স্ট্রাকচারের ডায়াগ্রাম নিচে দেওয়া হল।
Abstract ActionBar.Tab
ট্যাবের অ্যাবস্ট্রাকশন লেয়ার তৈরি করা শুরু করতে, ট্যাবকে উপস্থাপন করে এমন একটি অ্যাবস্ট্রাক্ট ক্লাস তৈরি করুন, যা ActionBar.Tab ইন্টারফেসকে মিরর করে:
Kotlin
sealed class CompatTab(val tag: String) { ... abstract fun getText(): CharSequence abstract fun getIcon(): Drawable abstract fun getCallback(): CompatTabListener abstract fun getFragment(): Fragment abstract fun setText(text: String): CompatTab abstract fun setIcon(icon: Drawable): CompatTab abstract fun setCallback(callback: CompatTabListener): CompatTab abstract fun setFragment(fragment: Fragment): CompatTab ... }
জাভা
public abstract class CompatTab { ... public abstract CompatTab setText(int resId); public abstract CompatTab setIcon(int resId); public abstract CompatTab setTabListener( CompatTabListener callback); public abstract CompatTab setFragment(Fragment fragment); public abstract CharSequence getText(); public abstract Drawable getIcon(); public abstract CompatTabListener getCallback(); public abstract Fragment getFragment(); ... }
অ্যাক্টিভিটির সাথে ট্যাব অবজেক্টের অ্যাসোসিয়েশনের মতো সাধারণ ফিচারের প্রয়োগ সহজ করতে আপনি এখানে ইন্টারফেসের পরিবর্তে অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করতে পারেন (কোড স্নিপেটে দেখানো হয়নি)।
অ্যাবস্ট্রাক্ট ActionBar ট্যাব পদ্ধতি
এরপর, একটি অ্যাবস্ট্রাক্ট ক্লাস নির্ধারণ করুন যা আপনাকে কোনও অ্যাক্টিভিটিতে ট্যাব তৈরি করতে এবং যোগ করতে দেয়, যেমন ActionBar.newTab() এবং ActionBar.addTab():
Kotlin
sealed class TabHelper(protected val activity: FragmentActivity) { ... abstract fun setUp() fun newTab(tag: String): CompatTab { // This method is implemented in a later lesson. } abstract fun addTab(tab: CompatTab) ... }
জাভা
public abstract class TabHelper { ... public CompatTab newTab(String tag) { // This method is implemented in a later lesson. } public abstract void addTab(CompatTab tab); ... }
পরবর্তী পাঠে, আপনি TabHelper এবং CompatTab-এর জন্য ইমপ্লিমেন্টেশন তৈরি করবেন যা প্ল্যাটফর্মের পুরনো এবং নতুন উভয় ভার্সনেই কাজ করে।