Proxy ke API baru

Tutorial ini menunjukkan cara membuat subclass dari class abstrak CompatTab dan TabHelper serta menggunakan API baru. Aplikasi Anda dapat menggunakan implementasi ini pada perangkat yang menjalankan versi platform yang mendukungnya.

Mengimplementasikan tab menggunakan API baru

Class konkret untuk CompatTab dan TabHelper yang menggunakan API terbaru merupakan implementasi proxy. Karena class abstrak yang dijelaskan dalam tutorial sebelumnya mencerminkan API baru (struktur class, tanda tangan metode, dll.), class konkret yang menggunakan API baru ini hanya menerapkan proxy pada panggilan metode dan hasilnya.

Anda dapat langsung menggunakan API baru di class concrete ini, dan tidak error di perangkat sebelumnya, karena pemuatan class yang lama. Class dimuat dan diinisialisasi pada akses pertama, dengan membuat instance class atau mengakses salah satu kolom maupun metode statisnya untuk pertama kalinya. Jadi, selama Anda tidak membuat instance implementasi spesifik Honeycomb pada perangkat pre-Honeycomb, VM Dalvik tidak akan memunculkan pengecualian VerifyError apa pun.

Konvensi penamaan yang baik untuk implementasi ini adalah dengan menambahkan level API atau nama kode versi platform yang sesuai dengan API yang diperlukan oleh class konkret. Misalnya, implementasi tab native dapat disediakan oleh class CompatTabHoneycomb dan TabHelperHoneycomb, karena mengandalkan API yang tersedia di Android 3.0 (API level 11) atau yang lebih baru.

Diagram class untuk penerapan Honeycomb pada tab.

Gambar 1. Diagram class untuk penerapan Honeycomb pada tab.

Mengimplementasikan CompatTabHoneycomb

CompatTabHoneycomb adalah implementasi dari class abstrak CompatTab yang digunakan oleh TabHelperHoneycomb untuk mereferensikan masing-masing tab. CompatTabHoneycomb cukup membuat proxy semua panggilan metode ke objek ActionBar.Tab yang ada di dalamnya.

Mulai mengimplementasikan CompatTabHoneycomb menggunakan API ActionBar.Tab baru:

Kotlin

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.)
}

Java

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.)
}

Mengimplementasikan TabHelperHoneycomb

TabHelperHoneycomb adalah implementasi dari class abstrak TabHelper yang membuat proxy panggilan metode ke ActionBar aktual, yang diperoleh dari Activity yang ada di dalamnya.

Implementasikan TabHelperHoneycomb, yang membuat proxy panggilan metode ke ActionBar API:

Kotlin

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)
    }
}

Java

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.
}

Anda juga harus membaca