فرض کنید میخواهید از تبهای نوار اکشن به عنوان شکل اصلی ناوبری سطح بالا در برنامه خود استفاده کنید. متأسفانه، APIهای ActionBar فقط در اندروید ۳.۰ یا بالاتر (سطح API ۱۱+) در دسترس هستند. بنابراین، اگر میخواهید برنامه خود را در دستگاههایی که نسخههای قبلی پلتفرم را اجرا میکنند توزیع کنید، باید پیادهسازیای ارائه دهید که از API جدیدتر پشتیبانی کند و در عین حال یک مکانیسم پشتیبان ارائه دهد که از APIهای قدیمیتر استفاده کند.
در این کلاس، شما یک کامپوننت رابط کاربری (UI) تببندیشده میسازید که از کلاسهای انتزاعی با پیادهسازیهای مختص به نسخه برای ارائه سازگاری رو به عقب استفاده میکند. این درس نحوه ایجاد یک لایه انتزاعی برای APIهای تب جدید را به عنوان اولین قدم برای ساخت کامپوننت تب شرح میدهد.
برای انتزاع آماده شوید
انتزاع در زبان برنامهنویسی جاوا شامل ایجاد یک یا چند رابط یا کلاس انتزاعی برای پنهان کردن جزئیات پیادهسازی است. در مورد APIهای جدیدتر اندروید، میتوانید از انتزاع برای ساخت کامپوننتهای آگاه از نسخه که از APIهای فعلی در دستگاههای جدیدتر استفاده میکنند و در دستگاههای قدیمیتر به APIهای قدیمیتر و سازگارتر رجوع میکنند، استفاده کنید.
هنگام استفاده از این رویکرد، ابتدا مشخص میکنید که میخواهید از کدام کلاسهای جدیدتر به صورت سازگار با نسخههای قبلی استفاده کنید، سپس کلاسهای انتزاعی را بر اساس رابطهای عمومی کلاسهای جدیدتر ایجاد میکنید. در تعریف رابطهای انتزاعی، باید تا حد امکان از API جدیدتر الگوبرداری کنید. این کار سازگاری رو به جلو را به حداکثر میرساند و حذف لایه انتزاعی را در آینده، زمانی که دیگر نیازی به آن نیست، آسانتر میکند.
پس از ایجاد کلاسهای انتزاعی برای این APIهای جدید، میتوان هر تعداد پیادهسازی را ایجاد و در زمان اجرا انتخاب کرد. برای اهداف سازگاری با نسخههای قبلی، این پیادهسازیها میتوانند بر اساس سطح API مورد نیاز متفاوت باشند. بنابراین، یک پیادهسازی ممکن است از APIهای اخیراً منتشر شده استفاده کند، در حالی که پیادهسازیهای دیگر میتوانند از APIهای قدیمیتر استفاده کنند.
ایجاد یک رابط تب انتزاعی
برای ایجاد یک نسخه سازگار با نسخههای قبلی تبها، ابتدا باید مشخص کنید که برنامه شما به کدام ویژگیها و APIهای خاص نیاز دارد. در مورد تبهای بخش سطح بالا، فرض کنید الزامات عملکردی زیر را دارید:
- نشانگرهای تب باید متن و یک آیکون را نشان دهند.
- تبها میتوانند با یک نمونه فرگمنت مرتبط باشند.
- این فعالیت باید بتواند تغییرات تب را تشخیص دهد.
آمادهسازی این الزامات از قبل به شما امکان میدهد دامنه لایه انتزاعی خود را کنترل کنید. این بدان معناست که میتوانید زمان کمتری را صرف ایجاد پیادهسازیهای متعدد از لایه انتزاعی خود کنید و زودتر از پیادهسازی جدید سازگار با نسخههای قبلی خود استفاده کنید.
APIهای کلیدی برای تبها در ActionBar و ActionBar.Tab قرار دارند. اینها APIهایی هستند که باید انتزاعی شوند تا تبهای شما از نسخه آگاه باشند. الزامات این پروژه نمونه، سازگاری با Eclair (سطح API 5) را در عین بهرهگیری از ویژگیهای جدید تب در Honeycomb (سطح API 11) ایجاب میکند. نموداری از ساختار کلاس برای پشتیبانی از این دو پیادهسازی و کلاسهای پایه انتزاعی (یا رابطهای) آنها در زیر آمده است.

نوار اقدام انتزاعی. تب
با ایجاد یک کلاس انتزاعی که نمایانگر یک تب است و رابط 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 ایجاد خواهید کرد که در نسخههای قدیمیتر و جدیدتر پلتفرمها کار میکنند.