Yeni API'lere yönlendirme

Bu derste, CompatTab ve TabHelper soyut sınıflarının nasıl alt sınıfa ayrılacağı ve yeni API'lerin nasıl kullanılacağı gösterilmektedir. Uygulamanız, bu uygulamayı destekleyen bir platform sürümü çalıştıran cihazlarda kullanılabilir.

Sekmeleri yeni API'ler kullanarak uygulayın

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ığından, bu yeni API'leri kullanan somut sınıflar yalnızca yöntem çağrılarını ve sonuçlarını proxy olarak kullanır.

Tembel sınıf yükleme özelliği sayesinde bu somut sınıflarda doğrudan yeni API'leri kullanabilir ve eski cihazlarda kilitlenme yaşamazsınız. Sınıflar yüklenir ve ilk erişimde başlatılır. Böylece, sınıf başlatılır veya statik alanlarından ya da yöntemlerinden birine ilk kez erişilir. Bu nedenle, Honeycomb öncesi cihazlarda Honeycomb'a özgü uygulamaları örneklemediğiniz sürece Dalvik sanal makinesi herhangi bir VerifyError istisnası atmaz.

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

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

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

CompatTabHoneycomb'u uygulama

CompatTabHoneycomb, TabHelperHoneycomb'nin tek sekmelere referans vermek için kullandığı CompatTab soyut sınıfının uygulamasıdır. CompatTabHoneycomb, tüm yöntem çağrılarını kapsadığı ActionBar.Tab nesnesine proxy olarak gönderir.

Yeni ActionBar.Tab API'lerini kullanarak CompatTabHoneycomb öğesini 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, yöntem çağrılarını içeren Activity öğesinden elde edilen gerçek bir ActionBar öğesine proxy yapan TabHelper soyut sınıfının uygulamasıdır.

ActionBar API'sine proxy uygulama yöntemi çağrıları olan TabHelperHoneycomb'yi 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 şunları da okumalısınız: