Yeni API'leri soyutlayın

Uygulamanızda birincil üst düzey gezinme biçimi olarak işlem çubuğu sekmelerini kullanmak istediğinizi varsayalım. Maalesef ActionBar API'leri yalnızca Android 3.0 veya sonraki sürümlerde (API düzeyi 11+) kullanılabilir. Bu nedenle, uygulamanızı platformun önceki sürümlerini çalıştıran cihazlarda dağıtmak istiyorsanız daha eski API'leri kullanan bir geri dönüş mekanizması sağlarken daha yeni API'yi destekleyen bir uygulama sağlamanız gerekir.

Bu derste, geriye dönük uyumluluk sağlamak için sürüme özel uygulamalarla soyut sınıflar kullanan sekmeli bir kullanıcı arayüzü (UI) bileşeni oluşturacaksınız. Bu derste, sekme bileşenini oluşturmaya yönelik ilk adım olarak yeni sekme API'leri için nasıl bir soyutlama katmanı oluşturulacağı açıklanmaktadır.

Soyutlamaya hazırlanma

Java programlama dilinde soyutlama, uygulama ayrıntılarını gizlemek için bir veya daha fazla arayüz ya da soyut sınıf oluşturmayı içerir. Daha yeni Android API'leri söz konusu olduğunda, daha yeni cihazlarda mevcut API'leri kullanan ve daha eski cihazlarda daha eski, daha uyumlu API'lere geri dönen sürüme duyarlı bileşenler oluşturmak için soyutlama kullanabilirsiniz.

Bu yaklaşımı kullanırken öncelikle geriye dönük uyumlu bir şekilde kullanmak istediğiniz yeni sınıfları belirlersiniz. Ardından, yeni sınıfların herkese açık arayüzlerini temel alarak soyut sınıflar oluşturursunuz. Özetleme arayüzlerini tanımlarken yeni API'yi mümkün olduğunca yansıtmalısınız. Bu, ileriye dönük uyumluluğu en üst düzeye çıkarır ve gelecekte artık gerekli olmadığında soyutlama katmanını bırakmayı kolaylaştırır.

Bu yeni API'ler için soyut sınıflar oluşturulduktan sonra, çalışma zamanında istenen sayıda uygulama oluşturulup seçilebilir. Geriye dönük uyumluluk amacıyla bu uygulamalar, gerekli API düzeyine göre değişiklik gösterebilir. Bu nedenle, bir uygulama yakın zamanda yayınlanan API'leri kullanabilirken diğerleri daha eski API'leri kullanabilir.

Özet sekmesi arayüzü oluşturma

Sekmelerin geriye dönük uyumlu bir sürümünü oluşturmak için öncelikle uygulamanızın hangi özelliklere ve belirli API'lere ihtiyaç duyduğunu belirlemeniz gerekir. Üst düzey bölüm sekmeleri için aşağıdaki işlevsel gereksinimlere sahip olduğunuzu varsayalım:

  1. Sekme göstergelerinde metin ve simge gösterilmelidir.
  2. Sekmeler bir parça örneğiyle ilişkilendirilebilir.
  3. Etkinlik, sekme değişikliklerini dinleyebilmelidir.

Bu koşulları önceden hazırlayarak soyutlama katmanınızın kapsamını kontrol edebilirsiniz. Bu sayede, soyutlama katmanınızın birden fazla uygulamasını oluşturmak için daha az zaman harcayabilir ve yeni geriye dönük uyumlu uygulamanızı daha erken kullanmaya başlayabilirsiniz.

Sekmelerle ilgili temel API'ler ActionBar ve ActionBar.Tab içinde yer alır. Sekmelerinizin sürümden bağımsız olması için soyutlanması gereken API'ler şunlardır: Bu örnek proje için, Honeycomb'daki (API düzeyi 11) yeni sekme özelliklerinden yararlanırken Eclair (API düzeyi 5) ile geriye dönük uyumluluk sağlanması gerekir. Bu iki uygulamayı ve bunların soyut temel sınıflarını (veya arayüzlerini) destekleyen sınıf yapısının diyagramı aşağıda verilmiştir.

Soyut temel sınıflar ve sürüme özgü uygulamalar.
Şekil 1. Soyut temel sınıfların ve sürüme özgü uygulamaların sınıf şeması.

Abstract ActionBar.Tab

ActionBar.Tab arayüzünü yansıtan bir sekmeyi temsil eden soyut bir sınıf oluşturarak sekme soyutlama katmanınızı oluşturmaya başlayın:

Kotlin

sealed class CompatTab(val tag: String) {
    ...
    abstract fun getText(): CharSequence
    abstract fun getIcon(): Drawable
    abstract fun getCallback(): CompatTabListener
    abstract fun getFragment(): Fragment

    abstract fun setText(text: String): CompatTab
    abstract fun setIcon(icon: Drawable): CompatTab
    abstract fun setCallback(callback: CompatTabListener): CompatTab
    abstract fun setFragment(fragment: Fragment): CompatTab
    ...
}

Java

public abstract class CompatTab {
    ...
    public abstract CompatTab setText(int resId);
    public abstract CompatTab setIcon(int resId);
    public abstract CompatTab setTabListener(
            CompatTabListener callback);
    public abstract CompatTab setFragment(Fragment fragment);

    public abstract CharSequence getText();
    public abstract Drawable getIcon();
    public abstract CompatTabListener getCallback();
    public abstract Fragment getFragment();
    ...
}

Burada, sekme nesnelerinin etkinliklerle ilişkilendirilmesi gibi ortak özelliklerin uygulanmasını basitleştirmek için arayüz yerine soyut bir sınıf kullanabilirsiniz (kod snippet'inde gösterilmemiştir).

Abstract ActionBar sekme yöntemleri

Ardından, ActionBar.newTab() ve ActionBar.addTab() gibi etkinliklere sekme oluşturup eklemenize olanak tanıyan bir soyut sınıf tanımlayın:

Kotlin

sealed class TabHelper(protected val activity: FragmentActivity) {
    ...

    abstract fun setUp()

    fun newTab(tag: String): CompatTab {
        // This method is implemented in a later lesson.
    }

    abstract fun addTab(tab: CompatTab)

    ...
}

Java

public abstract class TabHelper {
    ...

    public CompatTab newTab(String tag) {
        // This method is implemented in a later lesson.
    }

    public abstract void addTab(CompatTab tab);

    ...
}

Sonraki derslerde, hem eski hem de yeni platform sürümlerinde çalışan TabHelper ve CompatTab için uygulamalar oluşturacaksınız.

Ayrıca, okunanlar