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 hem yeni API'yi destekleyen bir uygulama sağlamanız hem de eski API'leri kullanan bir yedek mekanizması 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 kullanan, sekmeli bir kullanıcı arayüzü bileşeni derleyeceksiniz. Bu derste, sekme bileşenini oluşturma yolunda ilk adım olarak yeni sekme API'ları için bir soyutlama katmanının nasıl oluşturulacağı açıklanmaktadır.

Özetlemeye hazırlanın

Java programlama dilindeki 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. Yeni Android API'lerinde, soyutlamadan yararlanarak yeni cihazlarda mevcut API'leri kullanan sürüme duyarlı bileşenler oluşturabilir ve eski cihazlarda ise eski ve daha uyumlu API'leri kullanabilirsiniz.

Bu yaklaşımı kullanırken önce hangi yeni sınıfları geriye dönük uyumlu şekilde kullanmak istediğinizi belirler, ardından yeni sınıfların herkese açık arayüzlerini temel alarak soyut sınıflar oluşturursunuz. Soyutlama arayüzlerini tanımlarken yeni API'yi mümkün olduğunca 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ı bırakmayı kolaylaştırır.

Bu yeni API'ler için soyut sınıflar oluşturduktan sonra çalışma zamanında istenilen sayıda uygulama oluşturulabilir ve seçilebilir. Geriye dönük uyumluluk açısından bu uygulamalar gerekli API düzeyine göre değişiklik gösterebilir. Bu nedenle, bir uygulama yakın zamanda kullanıma sunulan API'leri kullanırken diğerleri daha eski API'leri kullanabilir.

Soyut bir sekme arayüzü oluşturma

Sekmelerin geriye dönük uyumlu sürümlerini 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 sekmelerinde aşağıdaki işlevsel şartlara sahip olduğunuzu varsayalım:

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

Bu koşulları önceden hazırlamak, soyutlama katmanınızın kapsamını kontrol etmenize olanak tanır. Bu, soyutlama katmanınızın birden fazla uygulamasını oluşturmak için daha az zaman harcayabileceğiniz ve geriye dönük uyumlu yeni uygulamanızı daha kısa sürede kullanmaya başlayabileceğiniz anlamına gelir.

Sekmeler için temel API'ler ActionBar ve ActionBar.Tab içindedir. Bunlar, sekmelerinizi sürüme duyarlı hale getirmek için soyutlanacak API'lerdir. Bu örnek projenin şartları, Honeycomb'daki (API Düzeyi 11) yeni sekme özelliklerinden yararlanırken tekrar Eclair'e (API düzeyi 5) uyumluluk gerektirir. Bu iki uygulamayı ve bunların soyut temel sınıflarını (veya arayüzlerini) destekleyecek sınıf yapısının diyagramı aşağıda gösterilmiştir.

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 İşlem Çubuğu.Sekme

Bir sekmeyi temsil eden ve ActionBar.Tab arayüzünü yansıtan 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 (kod snippet'inde gösterilmeyen) ilişkilendirilmesi gibi yaygın özelliklerin uygulanmasını basitleştirmek için buradaki arayüz yerine soyut bir sınıf kullanabilirsiniz.

Soyut ActionBar sekme yöntemleri

Daha sonra, ActionBar.newTab() ve ActionBar.addTab() gibi bir etkinlikte sekme oluşturup eklemenize olanak tanıyan 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 şunları da okumalısınız: