Eski API'lerle uygulama oluşturma

Bu derste, daha yeni API'leri yansıtan ancak eski cihazları destekleyen bir uygulamanın nasıl oluşturulacağı anlatılmaktadır.

Alternatif bir çözüm kararlaştırın

Yeni kullanıcı arayüzü özelliklerini geriye dönük uyumlu olarak kullanma konusundaki en zor görev, eski platform sürümleri için daha eski (yedek) bir çözüme karar vermek ve bu çözümü uygulamaktır. Çoğu durumda, eski kullanıcı arayüzü çerçevesi özelliklerini kullanarak bu yeni kullanıcı arayüzü bileşenlerinin amacını yerine getirmek mümkündür. Örneğin:

  • İşlem çubukları, resim düğmeleri içeren yatay bir LinearLayout kullanılarak özel başlık çubukları veya etkinlik düzeninizde görünümler şeklinde uygulanabilir. Taşma işlemleri cihazın Menü düğmesi altında sunulabilir.

  • İşlem çubuğu sekmeleri, düğmeler içeren yatay bir LinearLayout veya TabWidget kullanıcı arayüzü öğesi kullanılarak uygulanabilir.

  • NumberPicker ve Switch widget'ları, sırasıyla Spinner ve ToggleButton widget'ları kullanılarak uygulanabilir.

  • ListPopupWindow ve PopupMenu widget'ları, PopupWindow widget'ları kullanılarak uygulanabilir.

Yeni kullanıcı arayüzü bileşenlerini eski cihazlara geri taşımak için genellikle herkese uygun tek bir çözüm yoktur. Kullanıcı deneyimine dikkat edin: Eski cihazlarda kullanıcılar yeni tasarım kalıplarına ve kullanıcı arayüzü bileşenlerine aşina olmayabilir. Aynı işlevin, tanıdık öğeler kullanılarak nasıl sunulabileceği üzerine biraz düşünün. Uygulama ekosisteminde daha yeni kullanıcı arayüzü bileşenleri (işlem çubuğu gibi) öne çıkıyorsa veya etkileşim modelinin son derece basit ve sezgisel olduğu durumlarda (örneğin, ViewPager kullanarak görünümleri hızlıca kaydırma) bu durum pek endişe duymaz.

Eski API'leri kullanarak sekmeleri uygulayın

İşlem çubuğu sekmelerinin eski bir uygulamasını oluşturmak için TabWidget ve TabHost kullanabilirsiniz (Bununla birlikte, yatay olarak yerleştirilmiş Button widget'ları da kullanılabilir). TabHelperEclair ve CompatTabEclair adlı sınıflarda bu uygulama, en geç Android 2.0 (Eclair) sürümünden önce kullanıma sunulan API'leri kullandığından bunu uygulayın.

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

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

Bu depolama alanını işlemek için kullanılabilecek bir ActionBar.Tab nesnesi olmadığından CompatTabEclair uygulaması, örnek değişkenlerinde sekme metni ve simgesi gibi sekme özelliklerini depolar:

Kotlin

class CompatTabEclair internal constructor(val activity: FragmentActivity, tag: String) :
        CompatTab(tag) {

    // Store these properties in the instance,
    // as there is no ActionBar.Tab object.
    private var text: CharSequence? = null
    ...

    override fun setText(resId: Int): CompatTab {
        // Our older implementation simply stores this
        // information in the object instance.
        text = activity.resources.getText(resId)
        return this
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

Java

public class CompatTabEclair extends CompatTab {
    // Store these properties in the instance,
    // as there is no ActionBar.Tab object.
    private CharSequence text;
    ...

    public CompatTab setText(int resId) {
        // Our older implementation simply stores this
        // information in the object instance.
        text = activity.getResources().getText(resId);
        return this;
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

TabHelperEclair uygulaması, TabHost widget'ındaki TabHost.TabSpec nesneleri ve sekme göstergeleri oluşturmak için kullanılan yöntemleri kullanır:

Kotlin

class TabHelperEclair internal constructor(activity: FragmentActivity) : TabHelper(activity) {

    private var tabHost: TabHost? = null
    ...

    override fun setUp() {
        // Our activity layout for pre-Honeycomb devices
        // must contain a TabHost.
        tabHost = tabHost ?: mActivity.findViewById<TabHost>(android.R.id.tabhost).apply {
            setup()
        }
    }

    override fun addTab(tab: CompatTab) {
        ...
        tabHost?.newTabSpec(tab.tag)?.run {
            setIndicator(tab.getText()) // And optional icon
            ...
            tabHost?.addTab(this)
        }
    }
    // The other important method, newTab() is part of
    // the base implementation.
}

Java

public class TabHelperEclair extends TabHelper {
    private TabHost tabHost;
    ...

    protected void setUp() {
        if (tabHost == null) {
            // Our activity layout for pre-Honeycomb devices
            // must contain a TabHost.
            tabHost = (TabHost) mActivity.findViewById(
                    android.R.id.tabhost);
            tabHost.setup();
        }
    }

    public void addTab(CompatTab tab) {
        ...
        TabSpec spec = tabHost
                .newTabSpec(tag)
                .setIndicator(tab.getText()); // And optional icon
        ...
        tabHost.addTab(spec);
    }

    // The other important method, newTab() is part of
    // the base implementation.
}

Şu anda iki tane CompatTab ve TabHelper uygulamanız var: Biri Android 3.0 veya sonraki sürümleri çalıştıran cihazlarda, diğeri ise yeni API'ler kullanan cihazlarda, diğeri ise Android 2.0 veya sonraki sürümleri çalıştıran ve eski API'leri kullanan cihazlarda çalışan. Bir sonraki derste, bu uygulamaları uygulamanızda kullanma konusunu ele alacağız.