ধরুন, আপনি আপনার অ্যাপ্লিকেশনে টপ-লেভেল নেভিগেশনের প্রধান মাধ্যম হিসেবে অ্যাকশন বার ট্যাব ব্যবহার করতে চান। দুর্ভাগ্যবশত, ActionBar এপিআইগুলো শুধুমাত্র অ্যান্ড্রয়েড ৩.০ বা তার পরবর্তী সংস্করণে (এপিআই লেভেল ১১+) উপলব্ধ। সুতরাং, আপনি যদি প্ল্যাটফর্মের পূর্ববর্তী সংস্করণ চালিত ডিভাইসগুলোতে আপনার অ্যাপ্লিকেশনটি বিতরণ করতে চান, তাহলে আপনাকে এমন একটি ইমপ্লিমেন্টেশন প্রদান করতে হবে যা নতুন এপিআই সমর্থন করে এবং একই সাথে পুরোনো এপিআই ব্যবহার করার জন্য একটি ফলব্যাক মেকানিজমও রাখে।
এই ক্লাসে, আপনি একটি ট্যাবযুক্ত ইউজার ইন্টারফেস (UI) কম্পোনেন্ট তৈরি করবেন যা ব্যাকওয়ার্ড-কম্প্যাটিবিলিটি প্রদানের জন্য ভার্সন-নির্দিষ্ট ইমপ্লিমেন্টেশনসহ অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করে। ট্যাব কম্পোনেন্ট তৈরির প্রথম ধাপ হিসেবে, এই পাঠে নতুন ট্যাব এপিআই-এর জন্য কীভাবে একটি অ্যাবস্ট্রাকশন লেয়ার তৈরি করতে হয় তা বর্ণনা করা হয়েছে।
বিমূর্ততার জন্য প্রস্তুত হন
জাভা প্রোগ্রামিং ভাষায় অ্যাবস্ট্রাকশন বলতে ইমপ্লিমেন্টেশনের খুঁটিনাটি বিষয় গোপন করার জন্য এক বা একাধিক ইন্টারফেস বা অ্যাবস্ট্রাক্ট ক্লাস তৈরি করাকে বোঝায়। নতুন অ্যান্ড্রয়েড এপিআই-এর ক্ষেত্রে, আপনি অ্যাবস্ট্রাকশন ব্যবহার করে ভার্সন-অ্যাওয়ার কম্পোনেন্ট তৈরি করতে পারেন, যা নতুন ডিভাইসগুলোতে বর্তমান এপিআই ব্যবহার করে এবং পুরোনো ডিভাইসগুলোতে পুরোনো ও অধিক সামঞ্জস্যপূর্ণ এপিআই-তে ফিরে যায়।
এই পদ্ধতি ব্যবহার করার সময়, প্রথমে আপনাকে নির্ধারণ করতে হবে যে আপনি কোন নতুন ক্লাসগুলো ব্যাকওয়ার্ড কম্প্যাটিবলভাবে ব্যবহার করতে চান, তারপর সেই নতুন ক্লাসগুলোর পাবলিক ইন্টারফেসের উপর ভিত্তি করে অ্যাবস্ট্রাক্ট ক্লাস তৈরি করতে হবে। অ্যাবস্ট্রাকশন ইন্টারফেসগুলো সংজ্ঞায়িত করার সময়, নতুন এপিআই-কে যতটা সম্ভব অনুকরণ করা উচিত। এটি ফরোয়ার্ড-কম্প্যাটিবিলিটি সর্বোচ্চ করে এবং ভবিষ্যতে যখন অ্যাবস্ট্রাকশন লেয়ারটির আর প্রয়োজন হবে না, তখন তা বাদ দেওয়া সহজ করে তোলে।
এই নতুন এপিআইগুলোর জন্য অ্যাবস্ট্রাক্ট ক্লাস তৈরি করার পর, রানটাইমে যেকোনো সংখ্যক ইমপ্লিমেন্টেশন তৈরি ও নির্বাচন করা যেতে পারে। ব্যাকওয়ার্ড-কম্প্যাটিবিলিটির উদ্দেশ্যে, এই ইমপ্লিমেন্টেশনগুলো প্রয়োজনীয় এপিআই লেভেল অনুযায়ী ভিন্ন হতে পারে। ফলে, একটি ইমপ্লিমেন্টেশন সম্প্রতি প্রকাশিত এপিআই ব্যবহার করতে পারে, আবার অন্যগুলো পুরোনো এপিআই ব্যবহার করতে পারে।
একটি অ্যাবস্ট্রাক্ট ট্যাব ইন্টারফেস তৈরি করুন
ট্যাবের একটি ব্যাকওয়ার্ড-কম্প্যাটিবল সংস্করণ তৈরি করার জন্য, প্রথমে আপনাকে নির্ধারণ করতে হবে আপনার অ্যাপ্লিকেশনের কোন কোন ফিচার এবং নির্দিষ্ট এপিআই প্রয়োজন। টপ-লেভেল সেকশন ট্যাবের ক্ষেত্রে, ধরুন আপনার নিম্নলিখিত ফাংশনাল রিকোয়ারমেন্টগুলো রয়েছে:
- ট্যাব নির্দেশকগুলোতে লেখা এবং একটি আইকন দেখানো উচিত।
- ট্যাবগুলোকে একটি ফ্র্যাগমেন্ট ইনস্ট্যান্সের সাথে যুক্ত করা যেতে পারে।
- অ্যাক্টিভিটিটির ট্যাব পরিবর্তনের সংকেত শোনার ক্ষমতা থাকা উচিত।
এই প্রয়োজনীয়তাগুলো আগে থেকে প্রস্তুত করে রাখলে আপনি আপনার অ্যাবস্ট্রাকশন লেয়ারের পরিধি নিয়ন্ত্রণ করতে পারবেন। এর মানে হলো, আপনি আপনার অ্যাবস্ট্রাকশন লেয়ারের একাধিক ইমপ্লিমেন্টেশন তৈরিতে কম সময় ব্যয় করতে পারবেন এবং আপনার নতুন ব্যাকওয়ার্ড-কম্প্যাটিবল ইমপ্লিমেন্টেশনটি আরও দ্রুত ব্যবহার শুরু করতে পারবেন।
ট্যাবের জন্য মূল এপিআইগুলো ActionBar এবং ActionBar.Tab এ রয়েছে। আপনার ট্যাবগুলোকে ভার্সন-সচেতন করে তোলার জন্য এই এপিআইগুলোকেই অ্যাবস্ট্রাক্ট করতে হবে। এই উদাহরণ প্রজেক্টটির জন্য Eclair (এপিআই লেভেল ৫) পর্যন্ত কম্প্যাটিবিলিটি বজায় রাখার পাশাপাশি Honeycomb (এপিআই লেভেল ১১)-এর নতুন ট্যাব ফিচারগুলোর সুবিধা গ্রহণ করা প্রয়োজন। এই দুটি ইমপ্লিমেন্টেশন এবং তাদের অ্যাবস্ট্রাক্ট বেস ক্লাস (বা ইন্টারফেস)-কে সমর্থনকারী ক্লাস কাঠামোর একটি ডায়াগ্রাম নিচে দেওয়া হলো।

অ্যাবস্ট্রাক্ট অ্যাকশনবার.ট্যাব
ActionBar.Tab ইন্টারফেসের অনুরূপ একটি ট্যাব প্রতিনিধিত্বকারী অ্যাবস্ট্রাক্ট ক্লাস তৈরি করার মাধ্যমে আপনার ট্যাব অ্যাবস্ট্রাকশন লেয়ার তৈরি করা শুরু করুন:
কোটলিন
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.newTab() এবং ActionBar.addTab() :
কোটলিন
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 এর এমন ইমপ্লিমেন্টেশন তৈরি করবেন যা পুরোনো এবং নতুন উভয় প্ল্যাটফর্ম সংস্করণেই কাজ করবে।