پروکسی به API های جدید

این درس به شما نشان می‌دهد که چگونه کلاس‌های انتزاعی CompatTab و TabHelper را زیرکلاس کنید و از APIهای جدید استفاده کنید. برنامه شما می‌تواند از این پیاده‌سازی در دستگاه‌هایی که نسخه پلتفرمی را اجرا می‌کنند که از آنها پشتیبانی می‌کند، استفاده کند.

پیاده‌سازی تب‌ها با استفاده از APIهای جدید

کلاس‌های عینی CompatTab و TabHelper که از APIهای جدیدتر استفاده می‌کنند، یک پیاده‌سازی پروکسی هستند. از آنجایی که کلاس‌های انتزاعی تعریف شده در درس قبل، APIهای جدید (ساختار کلاس، امضای متدها و غیره) را منعکس می‌کنند، کلاس‌های عینی که از این APIهای جدیدتر استفاده می‌کنند، فراخوانی‌های متد پروکسی و نتایج آنها را نیز منعکس می‌کنند.

شما می‌توانید مستقیماً از APIهای جدیدتر در این کلاس‌های واقعی استفاده کنید - و به دلیل بارگذاری کند کلاس، در دستگاه‌های قدیمی‌تر دچار مشکل نشوید. کلاس‌ها در اولین دسترسی بارگذاری و مقداردهی اولیه می‌شوند - یعنی از کلاس نمونه‌سازی می‌شود یا برای اولین بار به یکی از فیلدها یا متدهای استاتیک آن دسترسی پیدا می‌شود. بنابراین، تا زمانی که پیاده‌سازی‌های مخصوص Honeycomb را در دستگاه‌های قبل از Honeycomb نمونه‌سازی نکنید، ماشین مجازی Dalvik هیچ خطای VerifyError را نشان نمی‌دهد.

یک قرارداد نامگذاری خوب برای این پیاده‌سازی، اضافه کردن نام کد سطح API یا نسخه پلتفرم مربوط به APIهای مورد نیاز کلاس‌های عینی است. برای مثال، پیاده‌سازی تب بومی می‌تواند توسط کلاس‌های CompatTabHoneycomb و TabHelperHoneycomb ارائه شود، زیرا آنها به APIهای موجود در اندروید ۳.۰ (سطح API ۱۱) یا بالاتر متکی هستند.

نمودار کلاس برای پیاده‌سازی لانه زنبوری تب‌ها.
شکل ۱. نمودار کلاس برای پیاده‌سازی لانه زنبوری تب‌ها.

پیاده‌سازی CompatTabHoneycomb

CompatTabHoneycomb پیاده‌سازی کلاس انتزاعی CompatTab است که TabHelperHoneycomb برای ارجاع به تب‌های منفرد از آن استفاده می‌کند. CompatTabHoneycomb تمام فراخوانی‌های متد را به شیء ActionBar.Tab موجود در خود پروکسی می‌کند.

شروع پیاده‌سازی CompatTabHoneycomb با استفاده از APIهای جدید ActionBar.Tab :

کاتلین

class CompatTabHoneycomb internal constructor(val activity: Activity, tag: String) :
        CompatTab(tag) {
    ...
    // The native tab object that this CompatTab acts as a proxy for.
    private var mTab: ActionBar.Tab =
            // Proxy to new ActionBar.newTab API
            activity.actionBar.newTab()

    override fun setText(@StringRes textId: Int): CompatTab {
        // Proxy to new ActionBar.Tab.setText API
        mTab.setText(textId)
        return this
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

جاوا

public class CompatTabHoneycomb extends CompatTab {
    // The native tab object that this CompatTab acts as a proxy for.
    ActionBar.Tab mTab;
    ...

    protected CompatTabHoneycomb(FragmentActivity activity, String tag) {
        ...
        // Proxy to new ActionBar.newTab API
        mTab = activity.getActionBar().newTab();
    }

    public CompatTab setText(int resId) {
        // Proxy to new ActionBar.Tab.setText API
        mTab.setText(resId);
        return this;
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

پیاده‌سازی TabHelperHoneycomb

TabHelperHoneycomb پیاده‌سازی کلاس انتزاعی TabHelper است که فراخوانی‌های متد را به یک ActionBar واقعی که از Activity موجود در آن به دست می‌آید، پروکسی می‌کند.

پیاده‌سازی TabHelperHoneycomb ، فراخوانی متدهای پروکسی به ActionBar API:

کاتلین

class TabHelperHoneycomb internal constructor(activity: FragmentActivity) : TabHelper(activity) {

    private var mActionBar: ActionBar? = null

    override fun setUp() {
        mActionBar = mActionBar ?: mActivity.actionBar.apply {
            navigationMode = ActionBar.NAVIGATION_MODE_TABS
        }
    }

    override fun addTab(tab: CompatTab) {
        // Tab is a CompatTabHoneycomb instance, so its
        // native tab object is an ActionBar.Tab.
        mActionBar?.addTab(tab.getTab() as ActionBar.Tab)
    }
}

جاوا

public class TabHelperHoneycomb extends TabHelper {
    ActionBar actionBar;
    ...

    protected void setUp() {
        if (actionBar == null) {
            actionBar = activity.getActionBar();
            actionBar.setNavigationMode(
                    ActionBar.NAVIGATION_MODE_TABS);
        }
    }

    public void addTab(CompatTab tab) {
        ...
        // Tab is a CompatTabHoneycomb instance, so its
        // native tab object is an ActionBar.Tab.
        actionBar.addTab((ActionBar.Tab) tab.getTab());
    }

    // The other important method, newTab() is part of
    // the base implementation.
}

شما هم باید بخوانید