فرض کنید میخواهید از برگههای نوار اقدام بهعنوان شکل اصلی پیمایش سطح بالا در برنامهتان استفاده کنید. متأسفانه، میاناهای برنامهسازی کاربردی ActionBar فقط در Android نسخه ۳.۰ یا بالاتر (سطح میانای برنامهسازی کاربردی ۱۱+) دردسترس هستند. بنابراین، اگر میخواهید برنامهتان را در دستگاههایی که نسخههای قدیمیتر پلاتفرم را اجرا میکنند توزیع کنید، باید پیادهسازیای ارائه دهید که از میانای برنامهسازی کاربردی جدیدتر پشتیبانی کند و درعینحال سازوکار جایگزینی ارائه دهد که از میاناهای برنامهسازی کاربردی قدیمیتر استفاده کند.
در این کلاس، یک مؤلفه میانای کاربر (UI) زبانهدار میسازید که از کلاسهای انتزاعی با پیادهسازیهای خاص نسخه برای ارائه سازگاری با نسخههای قدیمی استفاده میکند. این درس نحوه ایجاد لایه انتزاعی برای میاناهای برنامهسازی کاربردی برگه جدید را بهعنوان اولین گام برای ساختن مؤلفه برگه شرح میدهد.
آماده شدن برای خلاصهسازی
انتزاع در زبان برنامهنویسی Java شامل ایجاد یک یا چند میانای یا کلاس انتزاعی برای پنهان کردن جزئیات پیادهسازی است. درمورد میاناهای برنامهسازی کاربردی جدیدتر Android، میتوانید از انتزاع برای ساختن مؤلفههای آگاه از نسخه استفاده کنید که از میاناهای برنامهسازی کاربردی فعلی در دستگاههای جدیدتر استفاده میکنند و در دستگاههای قدیمیتر به میاناهای برنامهسازی کاربردی قدیمیتر و سازگارتر برمیگردند.
هنگام استفاده از این رویکرد، ابتدا تعیین میکنید که میخواهید از کدام کلاسهای جدیدتر بهصورت سازگار با نسخه قدیمی استفاده کنید، سپس کلاسهای انتزاعی را براساس میاناهای عمومی کلاسهای جدیدتر ایجاد میکنید. در تعریف میاناهای انتزاعی، باید تا حد امکان میانای برنامهسازی کاربردی جدیدتر را منعکس کنید. این کار سازگاری پیشرو را به حداکثر میرساند و باعث میشود در آینده که دیگر نیازی به لایه انتزاعی نیست، حذف آن آسانتر شود.
پساز ایجاد کلاسهای انتزاعی برای این میاناهای برنامهسازی کاربردی جدید، میتوان هر تعداد پیادهسازی را در زمان اجرا ایجاد و انتخاب کرد. برای اهداف سازگاری با نسخه قدیمی، این پیادهسازیها میتوانند براساس سطح میانای برنامهسازی کاربردی موردنیاز متفاوت باشند. بنابراین، یک پیادهسازی ممکن است از میاناهای برنامهسازی کاربردی تازه منتشرشده استفاده کند، درحالیکه پیادهسازیهای دیگر میتوانند از میاناهای برنامهسازی کاربردی قدیمیتر استفاده کنند.
یک میانای زبانه انتزاعی بساز
برای ایجاد نسخه سازگار با نسخه قدیمی از برگهها، ابتدا باید تعیین کنید که برنامه شما به کدام ویژگیها و میاناهای برنامهسازی کاربردی خاص نیاز دارد. درمورد برگههای بخش سطح بالا، فرض کنید الزامات عملکردی زیر را دارید:
- نشانگرهای برگه باید نوشتار و نماد را نشان دهند.
- برگهها را میتوان با نمونه قطعه مرتبط کرد.
- فعالیت باید بتواند تغییرات برگه را گوش کند.
آمادهسازی این الزامات ازقبل به شما امکان میدهد دامنه لایه انتزاعیتان را کنترل کنید. این یعنی میتوانید زمان کمتری را صرف ایجاد پیادهسازیهای متعدد از لایه انتزاعی خود کنید و زودتر از پیادهسازی جدید سازگار با نسخه قدیمی خود استفاده کنید.
میاناهای برنامهسازی کاربردی کلیدی برای برگهها در ActionBar و ActionBar.Tab هستند. اینها میاناهای برنامهسازی کاربردی هستند که باید خلاصه شوند تا برگههایتان از نسخه مطلع شوند. الزامات این پروژه نمونه، سازگاری با Eclair (سطح API ۵) را میطلبد، درحالیکه از ویژگیهای برگه جدید در Honeycomb (سطح API ۱۱) بهره میبرد. نمودار ساختار کلاس برای پشتیبانی از این دو پیادهسازی و کلاسهای پایه انتزاعی (یا میاناهای) آنها در زیر آمده است.
Abstract ActionBar.Tab
با ایجاد یک کلاس انتزاعی که نشاندهنده یک برگه است و رابط 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 انتزاعی
سپس، کلاس انتزاعیای را تعریف کنید که به شما امکان میدهد برگهها را ایجاد کنید و به فعالیتی اضافه کنید، مثل 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 ایجاد میکنید که در نسخههای قدیمیتر و جدیدتر پلاتفرم کار میکنند.