Yeni API'lere yönlendirme

Bu derste, CompatTab ve TabHelper soyut sınıflarının nasıl alt sınıflara ayrılacağı ve yeni API'lerin nasıl kullanılacağı gösterilmektedir. Uygulamanız, bu işlevleri destekleyen platform sürümünün yüklü olduğu cihazlarda bu uygulamayı kullanabilir.

Yeni API'leri kullanarak sekmeler uygulama

Daha yeni API'leri kullanan CompatTab ve TabHelper için somut sınıflar bir proxy uygulamasıdır. Önceki derste tanımlanan soyut sınıflar yeni API'leri (sınıf yapısı, yöntem imzaları vb.) yansıttığı için bu yeni API'leri kullanan somut sınıflar, yöntem çağrılarını ve sonuçlarını proxy'ler.

Geç yüklenen sınıflar sayesinde, bu somut sınıflarda daha yeni API'leri doğrudan kullanabilir ve önceki cihazlarda kilitlenme sorunu yaşamayabilirsiniz. Sınıflar, ilk erişimde yüklenir ve başlatılır. Bu işlem, sınıfı oluşturma veya statik alanlarından ya da yöntemlerinden birine ilk kez erişme şeklinde gerçekleşir. Bu nedenle, Honeycomb öncesi cihazlarda Honeycomb'e özgü uygulamaları örneklendirmediğiniz sürece Dalvik VM herhangi bir VerifyError istisnası hata vermez.

Bu uygulama için iyi bir adlandırma kuralı, somut sınıfların gerektirdiği API'lere karşılık gelen API düzeyi veya platform sürümü kodu adını eklemektir. Örneğin, Android 3.0 (API düzeyi 11) veya sonraki sürümlerde kullanılabilen API'leri kullandıkları için yerel sekme uygulaması CompatTabHoneycomb ve TabHelperHoneycomb sınıfları tarafından sağlanabilir.

Sekmelerin Honeycomb uygulamasının sınıf şeması.
Şekil 1. Sekmelerin Honeycomb uygulamasının sınıf şeması.

CompatTabHoneycomb'u uygulama

CompatTabHoneycomb, TabHelperHoneycomb'nin tek sekmelere referans vermek için kullandığı CompatTab soyut sınıfının uygulanmasıdır. CompatTabHoneycomb, içerdiği ActionBar.Tab nesnesine yapılan tüm yöntem çağrılarını proxy'ler.

Yeni ActionBar.Tab API'lerini kullanarak CompatTabHoneycomb'yı uygulamaya başlayın:

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

TabHelperHoneycomb'u uygulama

TabHelperHoneycomb, içerdiği Activity öğesinden elde edilen gerçek bir ActionBar öğesine yöntem çağrılarını yönlendiren TabHelper soyut sınıfının uygulanmasıdır.

TabHelperHoneycomb yöntemini uygulayın ve ActionBar API'ye proxy oluşturma yöntemi çağrıları yapın:

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

Ayrıca, okunanlar