Serwer proxy do nowych interfejsów API

Z tej lekcji dowiesz się, jak wyróżnić klasy abstrakcyjne CompatTab i TabHelper oraz jak używać nowych interfejsów API. Aplikacja może używać tej implementacji na urządzeniach z obsługą platformy w wersji, która je obsługuje.

Implementacja kart za pomocą nowych interfejsów API

Konkretne klasy elementów CompatTab i TabHelper, które używają nowszych interfejsów API, to implementacja proxy. Ponieważ klasy abstrakcyjne zdefiniowane w poprzedniej lekcji są zgodne z nowymi interfejsami API (strukturą klas, podpisami metod itp.), konkretne klasy korzystające z nowych interfejsów API po prostu wywołują metody proxy i ich wyniki.

W tych konkretnych klasach możesz bezpośrednio używać nowszych interfejsów API i nie ulegać awariom na wcześniejszych urządzeniach z powodu leniwego ładowania klas. Klasy są wczytywane i inicjowane przy pierwszym dostępie – inicjując je lub po raz pierwszy uzyskując dostęp do jednego z jej statycznych pól bądź metod. Dlatego jeśli nie utworzysz instancji implementacji przeznaczonych do Honeycomb na urządzeniach starszych niż Honeycomb, maszyna wirtualna Dalvik nie będzie zgłaszać żadnych wyjątków VerifyError.

Dobra konwencja nazewnictwa w przypadku tej implementacji polega na dołączeniu nazwy kodu poziomu interfejsu API lub kodu wersji platformy od odpowiednich interfejsów API wymaganych przez konkretne klasy. Na przykład implementację kart natywnych może dostarczać klasy CompatTabHoneycomb i TabHelperHoneycomb, ponieważ wykorzystują one interfejsy API dostępne w Androidzie 3.0 (poziom API 11) lub nowszym.

Diagram klasy implementacji kart Honeycomb.

Rysunek 1. Diagram klasy implementacji kart Honeycomb.

Implementacja CompatTabHoneycomb

CompatTabHoneycomb to implementacja klasy abstrakcyjnej CompatTab, której TabHelperHoneycomb używa do odwoływania się do poszczególnych kart. CompatTabHoneycomb po prostu przekierowuje wszystkie wywołania metod do zawartego w nim 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.)
}

Implementacja TabHelperHoneycomb

TabHelperHoneycomb to implementacja klasy abstrakcyjnej TabHelper, która wywołuje metodę proxy do rzeczywistego ActionBar uzyskanego z zawartego w nim Activity.

Zaimplementuj TabHelperHoneycomb, przekierowując wywołania metody 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.
}

Przeczytaj też