Yeni API'leri soyutlayın

Uygulamanızda üst düzey gezinmenin birincil 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 cihazlara dağıtmak isterseniz, yeni API'yi destekleyen bir uygulama sağlarken, eski API'leri kullanan bir yedek mekanizması da sağlamanız gerekir.

Bu sınıfta, geriye dönük uyumluluk sağlamak için sürüme özgü uygulamalara sahip soyut sınıfların kullanıldığı sekmeli bir kullanıcı arayüzü bileşeni oluşturacaksınız. Bu derste, sekme bileşeni oluşturmaya yönelik ilk adım olarak yeni sekme API'ları için bir soyutlama katmanının nasıl oluşturulacağı açıklanmaktadır.

Soyutlama için hazırlanın

Java programlama dilinde soyutlama, uygulama ayrıntılarının gizlenmesi için bir veya daha fazla arayüz ya da soyut sınıfın oluşturulması anlamına gelir. Yeni Android API'lerinde, soyutlama kullanarak yeni cihazlarda mevcut API'leri kullanan sürüme duyarlı bileşenler oluşturabilir ve eski cihazlarda daha eski ve daha uyumlu API'lere geri dönebilirsiniz.

Bu yaklaşımı kullanırken ilk olarak hangi yeni sınıfları geriye dönük uyumlu olarak kullanmak istediğinizi belirler, ardından yeni sınıfların herkese açık arayüzlerini temel alan soyut sınıflar oluşturursunuz. Soyutlama arayüzlerini tanımlarken mümkün olduğunca yeni API'yi yansıtmanız gerekir. Bu, ileriye dönük uyumluluğu en üst düzeye çıkarır ve gelecekte, artık gerekli olmadığında soyutlama katmanının bırakılmasını kolaylaştırır.

Bu yeni API'ler için soyut sınıflar oluşturduktan sonra, çalışma zamanında istenen sayıda uygulama oluşturulabilir ve seçilebilir. Geriye dönük uyumluluk amacıyla, bu uygulamalar gerekli API düzeyine göre farklılık gösterebilir. Bu nedenle, bir uygulama yeni yayınlanan API'leri kullanırken diğer uygulamalarda eski API'ler kullanılabilir.

Soyut sekme arayüzü oluşturma

Sekmelerin geriye dönük uyumlu sürümlerini oluşturmak için öncelikle uygulamanızın gerektirdiği özellikleri ve belirli API'ları belirlemeniz gerekir. Üst düzey bölüm sekmelerinde, aşağıdaki işlevsel gereksinimlere sahip olduğunuzu varsayalım:

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

Bu gereksinimleri önceden hazırlamak, soyutlama katmanınızın kapsamını kontrol etmenize olanak tanır. Bu sayede soyutlama katmanınızın birden fazla uygulamasını oluşturmak için daha az zaman harcayabilir ve geriye dönük uyumlu yeni uygulamanızı kullanmaya daha erken başlayabilirsiniz.

Sekmeler için temel API'ler ActionBar ve ActionBar.Tab şeklindedir. Bunlar, sekmelerinizin sürüme duyarlı olmasını sağlamak için soyutlanacak API'lardır. Bu örnek projenin gereksinimleri, Honeycomb'daki (API Düzeyi 11) yeni sekme özelliklerinden yararlanırken Eclair (API düzeyi 5) ile uyumluluğu gerektirir. Aşağıda, bu iki uygulamayı ve bunların soyut temel sınıflarını (veya arayüzlerini) destekleyecek sınıf yapısının bir diyagramı gösterilmektedir.

Soyut temel sınıfların ve sürüme özgü uygulamaların sınıf diyagramı.

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

Soyut ActionBar.Sekme

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();
    ...
}

Sekme nesnelerinin etkinliklerle ilişkilendirilmesi (kod snippet'inde gösterilmez) gibi yaygın özelliklerin uygulanmasını kolaylaştırmak için buradaki arayüz yerine soyut bir sınıf kullanabilirsiniz.

Soyut ActionBar sekme yöntemleri

Ardından, ActionBar.newTab() ve ActionBar.addTab() gibi sekmeler oluşturup bir etkinliğe ekleyebileceğiniz soyut bir 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 TabHelper ve CompatTab için hem eski hem de yeni platform sürümlerinde çalışan uygulamalar oluşturacaksınız.

Ayrıca şu makaleleri de okumalısınız: