Serwer proxy do nowych interfejsów API

Z tej lekcji dowiesz się, jak utworzyć podklasę klas abstrakcyjnych CompatTab i TabHelper oraz jak korzystać z nowych interfejsów API. Twoja aplikacja może używać tej implementacji na urządzeniach z platformą w wersji, która ją obsługuje.

Implementowanie kart za pomocą nowych interfejsów API

Konkretne klasy CompatTab i TabHelper, które korzystają z nowszych interfejsów API, są implementacją proxy. Ponieważ klasy abstrakcyjne zdefiniowane w poprzedniej lekcji odzwierciedlają nowe interfejsy API (strukturę klas, sygnatury metod itp.), konkretne klasy, które korzystają z tych nowszych interfejsów API, przekazują wywołania metod i ich wyniki.

Dzięki leniwemu ładowaniu klas możesz bezpośrednio używać nowszych interfejsów API w tych konkretnych klasach i nie powodować awarii na starszych urządzeniach. Klasy są ładowane i inicjowane przy pierwszym dostępie – podczas tworzenia instancji klasy lub pierwszego dostępu do jednego z jej statycznych pól lub metod. Dlatego, dopóki nie utworzysz instancji implementacji specyficznych dla Honeycomb na urządzeniach z Androidem w wersji starszej niż Honeycomb, maszyna wirtualna Dalvik nie będzie zgłaszać żadnych wyjątków VerifyError.

Dobrym sposobem na nazwanie tej implementacji jest dodanie poziomu interfejsu API lub nazwy kodowej wersji platformy odpowiadającej interfejsom API wymaganym przez konkretne klasy. Na przykład natywną implementację kart można udostępnić za pomocą klas CompatTabHoneycomb i TabHelperHoneycomb, ponieważ korzystają one z interfejsów API dostępnych w Androidzie 3.0 (poziom interfejsu API 11) lub nowszym.

Diagram klas dla implementacji kart w Honeycomb.
Rysunek 1. Diagram klas implementacji kart w Honeycomb.

Implementowanie CompatTabHoneycomb

CompatTabHoneycomb to implementacja klasy abstrakcyjnej CompatTab, której TabHelperHoneycomb używa do odwoływania się do poszczególnych kart. CompatTabHoneycomb przekazuje wszystkie wywołania metod do zawartego w niej obiektu ActionBar.Tab.

Zacznij implementować CompatTabHoneycomb za pomocą nowych interfejsów API ActionBar.Tab:

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

Implementowanie TabHelperHoneycomb

TabHelperHoneycomb to implementacja klasy abstrakcyjnej TabHelper, która przekazuje wywołania metod do rzeczywistego ActionBar uzyskanego z zawartego w niej Activity.

Zaimplementuj TabHelperHoneycomb, przekazując wywołania metod do interfejsu API ActionBar:

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

Warto też przeczytać