پراکسی به میاناهای برنامه‌سازی کاربردی جدید

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

پیاده‌سازی برگه‌ها بااستفاده از میاناهای برنامه‌سازی کاربردی جدید

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

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

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

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

پیاده‌سازی CompatTabHoneycomb

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

پیاده‌سازی CompatTabHoneycomb را بااستفاده از میاناهای برنامه‌سازی کاربردی 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.
}

همچنین باید این موارد را بخوانید