فرض کنید می خواهید از برگه های نوار عمل به عنوان شکل اولیه ناوبری سطح بالا در برنامه خود استفاده کنید. متأسفانه ActionBar
API ها فقط در Android نسخه 3.0 یا بالاتر (سطح API 11+) در دسترس هستند. بنابراین، اگر میخواهید برنامه خود را در دستگاههایی که نسخههای قبلی پلتفرم را اجرا میکنند، توزیع کنید، باید پیادهسازی را ارائه کنید که از API جدیدتر پشتیبانی کند و در عین حال مکانیزم بازگشتی را ارائه دهید که از APIهای قدیمیتر استفاده میکند.
در این کلاس، شما یک مؤلفه رابط کاربری زبانهدار (UI) میسازید که از کلاسهای انتزاعی با پیادهسازیهای خاص نسخه برای ارائه سازگاری به عقب استفاده میکند. این درس نحوه ایجاد یک لایه انتزاعی برای APIهای برگه جدید را به عنوان اولین گام به سمت ساخت مؤلفه تب توضیح می دهد.
برای انتزاع آماده شوید
انتزاع در زبان برنامه نویسی جاوا شامل ایجاد یک یا چند رابط یا کلاس انتزاعی برای پنهان کردن جزئیات پیاده سازی است. در مورد APIهای جدیدتر Android، میتوانید از انتزاع برای ساخت مؤلفههایی با نسخه آگاه استفاده کنید که از APIهای فعلی در دستگاههای جدیدتر استفاده میکنند، و جایگزینی به APIهای قدیمیتر و سازگارتر در دستگاههای قدیمیتر.
هنگام استفاده از این رویکرد، ابتدا تعیین میکنید که از چه کلاسهای جدیدتری میخواهید بتوانید به روشی سازگار با عقب استفاده کنید، سپس کلاسهای انتزاعی را بر اساس رابطهای عمومی کلاسهای جدیدتر ایجاد میکنید. در تعریف واسط های انتزاعی، باید API جدیدتر را تا حد امکان منعکس کنید. این کار سازگاری رو به جلو را به حداکثر میرساند و حذف لایه انتزاعی را در آینده در زمانی که دیگر ضروری نیست آسانتر میکند.
پس از ایجاد کلاس های انتزاعی برای این API های جدید، هر تعداد پیاده سازی را می توان در زمان اجرا ایجاد و انتخاب کرد. برای اهداف سازگاری با عقب، این پیاده سازی ها می توانند بر اساس سطح API مورد نیاز متفاوت باشند. بنابراین، یک پیاده سازی ممکن است از API های اخیرا منتشر شده استفاده کند، در حالی که دیگران می توانند از API های قدیمی استفاده کنند.
یک رابط برگه انتزاعی ایجاد کنید
به منظور ایجاد یک نسخه سازگار با عقب از تب ها، ابتدا باید مشخص کنید که برنامه شما به کدام ویژگی ها و API های خاص نیاز دارد. در مورد برگههای بخش سطح بالا، فرض کنید الزامات عملکردی زیر را دارید:
- نشانگرهای برگه باید متن و یک نماد را نشان دهند.
- برگه ها را می توان با یک نمونه قطعه مرتبط کرد.
- فعالیت باید بتواند به تغییرات برگه گوش دهد.
آماده سازی این الزامات از قبل به شما امکان می دهد تا محدوده لایه انتزاعی خود را کنترل کنید. این بدان معنی است که می توانید زمان کمتری را صرف ایجاد چندین پیاده سازی از لایه انتزاعی خود کنید و زودتر از پیاده سازی جدید سازگار با عقب خود استفاده کنید.
API های کلیدی برای برگه ها در ActionBar
و ActionBar.Tab
هستند. اینها APIهایی هستند که باید انتزاع کنید تا برگه های شما از نسخه آگاه شوند. الزامات این پروژه نمونه، سازگاری مجدد با Eclair (سطح API 5) و در عین حال بهرهگیری از ویژگیهای برگه جدید در Honeycomb (سطح API 11) را میطلبد. نموداری از ساختار کلاس برای پشتیبانی از این دو پیاده سازی و کلاس های پایه انتزاعی (یا رابط) آنها در زیر نشان داده شده است.
![نمودار کلاس کلاس های پایه انتزاعی و پیاده سازی های خاص نسخه.](https://developer.android.com/static/images/training/backward-compatible-ui-classes.png?hl=fa)
شکل 1. نمودار کلاسی کلاس های پایه انتزاعی و پیاده سازی های خاص نسخه.
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 Abstract
در مرحله بعد، یک کلاس انتزاعی را تعریف کنید که به شما امکان می دهد برگه هایی مانند 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
ایجاد میکنید که در نسخههای قدیمیتر و جدیدتر پلتفرم کار میکنند.