Yeni API'lere yönlendirme

Bu derste, CompatTab ve TabHelper soyut sınıflarının nasıl alt sınıflandırı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'ler kullanan CompatTab ve TabHelper için somut sınıflar, 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 sadece proxy yöntem çağrıları ve bunların sonuçlarını yansıtır.

Geç yüklenen sınıf nedeniyle eski cihazlarda kilitlenmeden önce bu somut sınıflarda daha yeni API'leri doğrudan kullanabilirsiniz. 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ı uygulamadığınız sürece Dalvik sanal makinesi herhangi bir VerifyError istisnası dikkate almaz.

Beton sınıfların gerektirdiği API'lere karşılık gelen API düzeyi veya platform sürümü kod adını eklemek bu uygulama için iyi bir adlandırma kuralıdır. Ö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 tek sekmelere referans vermek için kullandığı CompatTab soyut sınıfın uygulamasıdır. CompatTabHoneycomb, tüm yöntem çağrılarını, içerdiği ActionBar.Tab nesnesine proxy yapar.

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öntemin, içerdiği Activity öğesinden elde edilen gerçek bir ActionBar öğesine proxy yaptığı 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: