मान लें कि आपको अपने ऐप्लिकेशन में टॉप-लेवल नेविगेशन के मुख्य तरीके के तौर पर, ऐक्शन बार टैब का इस्तेमाल करना है. माफ़ करें, ActionBar एपीआई सिर्फ़ Android 3.0 या उसके बाद के वर्शन (एपीआई लेवल 11+) में उपलब्ध हैं. इसलिए, अगर आपको अपने ऐप्लिकेशन को प्लैटफ़ॉर्म के पुराने वर्शन वाले डिवाइसों पर डिस्ट्रिब्यूट करना है, तो आपको एक ऐसा तरीका उपलब्ध कराना होगा जो नए एपीआई के साथ काम करता हो. साथ ही, आपको एक फ़ॉलबैक मैकेनिज़्म उपलब्ध कराना होगा जो पुराने एपीआई का इस्तेमाल करता हो.
इस क्लास में, टैब वाला यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट बनाया जाता है. यह कॉम्पोनेंट, ऐब्स्ट्रैक्ट क्लास का इस्तेमाल करता है. साथ ही, वर्शन के हिसाब से लागू होने वाले कोड का इस्तेमाल करके, पिछले वर्शन के साथ काम करने की सुविधा देता है. इस सबक में, टैब कॉम्पोनेंट बनाने के पहले चरण के तौर पर, नए टैब एपीआई के लिए ऐब्स्ट्रैक्शन लेयर बनाने का तरीका बताया गया है.
ऐब्स्ट्रैक्शन के लिए तैयारी करना
Java प्रोग्रामिंग भाषा में ऐब्स्ट्रैक्शन का मतलब है कि एक या उससे ज़्यादा इंटरफ़ेस या ऐब्स्ट्रैक्ट क्लास बनाकर, लागू करने से जुड़ी जानकारी को छिपाया जाता है. Android के नए एपीआई के मामले में, अबस्ट्रैक्शन का इस्तेमाल करके ऐसे कॉम्पोनेंट बनाए जा सकते हैं जो वर्शन के हिसाब से काम करते हैं. ये कॉम्पोनेंट, नए डिवाइसों पर मौजूदा एपीआई का इस्तेमाल करते हैं. वहीं, पुराने डिवाइसों पर पुराने और ज़्यादा कंपैटिबल एपीआई का इस्तेमाल करते हैं.
इस तरीके का इस्तेमाल करते समय, सबसे पहले यह तय करें कि आपको किन नई क्लास का इस्तेमाल, बैकवर्ड कंपैटिबिलिटी के साथ करना है. इसके बाद, नई क्लास के सार्वजनिक इंटरफ़ेस के आधार पर ऐब्स्ट्रैक्ट क्लास बनाएं. ऐब्स्ट्रैक्शन इंटरफ़ेस तय करते समय, आपको नए एपीआई को ज़्यादा से ज़्यादा कॉपी करना चाहिए. इससे आने वाले समय में बेहतर तरीके से काम होता है. साथ ही, जब इसकी ज़रूरत न हो, तो ऐब्स्ट्रैक्शन लेयर को हटाना आसान हो जाता है.
इन नए एपीआई के लिए ऐब्स्ट्रैक्ट क्लास बनाने के बाद, रनटाइम में कई तरह के इंप्लीमेंटेशन बनाए और चुने जा सकते हैं. पिछले वर्शन के साथ काम करने की सुविधा के लिए, ये लागू करने के तरीके, ज़रूरी एपीआई लेवल के हिसाब से अलग-अलग हो सकते हैं. इसलिए, एक लागू करने की प्रोसेस में हाल ही में रिलीज़ किए गए एपीआई का इस्तेमाल किया जा सकता है, जबकि अन्य में पुराने एपीआई का इस्तेमाल किया जा सकता है.
ऐब्स्ट्रैक्ट टैब इंटरफ़ेस बनाना
टैब का ऐसा वर्शन बनाने के लिए जो पुराने वर्शन के साथ काम कर सके, आपको सबसे पहले यह तय करना होगा कि आपके ऐप्लिकेशन को किन सुविधाओं और एपीआई की ज़रूरत है. मान लें कि टॉप-लेवल सेक्शन टैब के लिए, आपको ये फ़ंक्शनल ज़रूरतें पूरी करनी हैं:
- टैब इंडिकेटर में टेक्स्ट और आइकॉन दिखना चाहिए.
- टैब को फ़्रैगमेंट इंस्टेंस से जोड़ा जा सकता है.
- गतिविधि में, टैब में हुए बदलावों को सुनने की सुविधा होनी चाहिए.
इन ज़रूरी शर्तों को पहले से तैयार रखने से, आपको ऐब्स्ट्रैक्शन लेयर के स्कोप को कंट्रोल करने में मदद मिलती है. इसका मतलब है कि अब आपको ऐब्स्ट्रैक्शन लेयर के कई वर्शन बनाने में कम समय लगेगा. साथ ही, बैकवर्ड-कंपैटिबल नए वर्शन का इस्तेमाल जल्द शुरू किया जा सकेगा.
टैब के लिए मुख्य एपीआई, ActionBar और ActionBar.Tab में हैं. ये ऐसे एपीआई हैं जिन्हें एब्स्ट्रैक्ट किया जाना चाहिए, ताकि आपके टैब को वर्शन के बारे में पता चल सके. इस उदाहरण प्रोजेक्ट के लिए, Eclair (एपीआई लेवल 5) के साथ काम करने की ज़रूरत है. साथ ही, Honeycomb (एपीआई लेवल 11) में टैब की नई सुविधाओं का फ़ायदा उठाना है. इन दोनों तरीकों और उनकी ऐब्स्ट्रैक्ट बेस क्लास (या इंटरफ़ेस) को सपोर्ट करने के लिए, क्लास स्ट्रक्चर का डायग्राम यहां दिया गया है.
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 ... }
Java
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(); ... }
यहां इंटरफ़ेस के बजाय किसी ऐब्स्ट्रैक्ट क्लास का इस्तेमाल किया जा सकता है. इससे, सामान्य सुविधाओं को लागू करना आसान हो जाता है. जैसे, टैब ऑब्जेक्ट को गतिविधियों से जोड़ना (कोड स्निपेट में नहीं दिखाया गया है).
AbstractActionBar टैब के तरीके
इसके बाद, एक ऐब्स्ट्रैक्ट क्लास तय करें. इससे किसी गतिविधि में टैब बनाए और जोड़े जा सकते हैं. जैसे, 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) ... }
Java
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 के लिए ऐसे तरीके बनाने हैं जो प्लैटफ़ॉर्म के पुराने और नए, दोनों वर्शन पर काम करें.