Yeni API'lere yönlendirme

Bu derste, CompatTab ve TabHelper soyut sınıflarını nasıl alt sınıflandıracağınız ve yeni API'leri nasıl kullanacağınız gösterilmektedir. Uygulamanız bu uygulamayı, destekleyen bir platform sürümü çalıştıran cihazlarda kullanabilir.

Yeni API'leri kullanarak sekmeleri uygulayın

CompatTab ve TabHelper için daha yeni API'ler kullanan somut sınıflar, proxy uygulamasıdır. Bir önceki derste tanımlanan soyut sınıflar, yeni API'leri (sınıf yapısı, yöntem imzaları vb.) yansıttığından, söz konusu yeni API'leri kullanan somut sınıflar, proxy yöntemi çağrıları ve bunların sonuçlarını yansıtmaktadır.

Geç sınıf yüklemeleri nedeniyle yeni API'leri doğrudan bu somut sınıflarda kullanabilir ve önceki cihazlarda kilitlenme yaşayamazsınız. Sınıflar, ilk erişimde yüklenir ve başlatılır. Böylece, sınıfın statik alanlarından veya yöntemlerinden birine ilk kez erişilir. Bu nedenle, petek öncesi cihazlarda Honeycomb'a özgü uygulamaları örneklendirmediğiniz sürece Dalvik sanal makinesi herhangi bir VerifyError istisnası devreye girmez.

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, yerel sekme uygulaması CompatTabHoneycomb ve TabHelperHoneycomb sınıfları tarafından sağlanabilir, çünkü bu sınıflar Android 3.0 (API düzeyi 11) veya sonraki sürümlerde bulunan API'leri temel alır.

Sekmelerin Honeycomb uygulaması için sınıf diyagramı.

Şekil 1. Sekmelerin Honeycomb uygulaması için sınıf diyagramı.

CompatTabHoneycomb'ı Uygulama

CompatTabHoneycomb, TabHelperHoneycomb tarafından ayrı sekmelere referansta bulunmak için kullanılan CompatTab soyut sınıfının uygulanmasıdır. CompatTabHoneycomb, tüm yöntem çağrılarını içerdiği ActionBar.Tab nesnesine proxy uygular.

Yeni ActionBar.Tab API'lerini kullanarak CompatTabHoneycomb uygulamasını 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'ı uygulama

TabHelperHoneycomb, proxy yönteminin içerdiği Activity öğesinden alınan gerçek bir ActionBar öğesine çağırdığı TabHelper soyut sınıfının uygulanmasıdır.

ActionBar API'sine proxy yaparak TabHelperHoneycomb yöntemini uygulayı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 şu makaleleri de okumalısınız: