Sürüme duyarlı bileşeni kullanma

Artık TabHelper ve CompatTab için iki uygulamanız var (biri Android 3.0 ve sonraki sürümler, diğeri ise platformun önceki sürümleri için). Şimdi bu uygulamalarla bir şeyler yapma zamanı. Bu derste, bu uygulamalar arasında geçiş yapma mantığını oluşturma, sürüme duyarlı düzenler oluşturma ve son olarak geriye dönük uyumlu kullanıcı arayüzü bileşenini kullanma konuları ele alınmaktadır.

Geçiş mantığını ekleme

TabHelper abstract sınıfı, mevcut cihazın platform sürümüne göre sürüme uygun TabHelper ve CompatTab örnekleri oluşturmak için fabrika görevi görür:

Kotlin

sealed class TabHelper(protected val mActivity: FragmentActivity, protected val tag: String) {

    abstract fun setUp()

    abstract fun addTab(tab: CompatTab)

    // Usage is tabHelper.newTab("tag")
    fun newTab(tag: String): CompatTab =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                CompatTabHoneycomb(mActivity, tag)
            } else {
                CompatTabEclair(mActivity, tag)
            }

    companion object {
        // Usage is TabHelper.createInstance(activity)
        fun createInstance(activity: FragmentActivity): TabHelper =
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    TabHelperHoneycomb(activity)
                } else {
                    TabHelperEclair(activity)
                }
    }
}

Java

public abstract class TabHelper {
    ...
    // Usage is TabHelper.createInstance(activity)
    public static TabHelper createInstance(FragmentActivity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            return new TabHelperHoneycomb(activity);
        } else {
            return new TabHelperEclair(activity);
        }
    }

    // Usage is tabHelper.newTab("tag")
    public CompatTab newTab(String tag) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            return new CompatTabHoneycomb(mActivity, tag);
        } else {
            return new CompatTabEclair(mActivity, tag);
        }
    }
    ...
}

Sürüme duyarlı etkinlik düzeni oluşturma

Bir sonraki adım, etkinliğiniz için iki sekme uygulamasını destekleyebilecek düzenler sağlamaktır. Eski uygulama (TabHelperEclair) için etkinlik düzeninizin, sekme içerikleri için bir kapsayıcıyla birlikte TabWidget ve TabHost içerdiğinden emin olmanız gerekir:

res/layout/main.xml:

<!-- This layout is for API level 5-10 only. -->
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp">

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

    </LinearLayout>
</TabHost>

TabHelperHoneycomb uygulaması için sekme göstergeleri ActionBar tarafından sağlandığından sekme içeriklerini barındıracak bir FrameLayout yeterlidir:

res/layout-v11/main.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabcontent"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Android, çalışma zamanında platform sürümüne bağlı olarak main.xml düzeninin hangi sürümünün genişletileceğine karar verir. Bu, hangi TabHelper uygulamasının kullanılacağını belirlemek için önceki bölümde gösterilen mantıkla aynıdır.

Etkinliğinizde TabHelper'ı kullanma

Etkinliğinizin onCreate() yönteminde bir TabHelper nesnesi elde edebilir ve aşağıdaki kodu kullanarak sekmeler ekleyebilirsiniz:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    setContentView(R.layout.main)

    TabHelper.createInstance(this).apply {
        setUp()

        newTab("photos")
                .setText(R.string.tab_photos)
                .also { photosTab ->
                    addTab(photosTab)
                }

        newTab("videos")
                .setText(R.string.tab_videos)
                .also { videosTab ->
                    addTab(videosTab)
                }
    }
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.main);

    TabHelper tabHelper = TabHelper.createInstance(this);
    tabHelper.setUp();

    CompatTab photosTab = tabHelper
            .newTab("photos")
            .setText(R.string.tab_photos);
    tabHelper.addTab(photosTab);

    CompatTab videosTab = tabHelper
            .newTab("videos")
            .setText(R.string.tab_videos);
    tabHelper.addTab(videosTab);
}

Uygulama çalıştırıldığında bu kod, doğru etkinlik düzenini şişirir ve TabHelperHoneycomb veya TabHelperEclair nesnesini başlatır. Gerçekte kullanılan somut sınıf, ortak TabHelper arayüzünü paylaştıkları için etkinlik için opak olur.

Bu uygulamanın Android 2.3 ve Android 4.0 cihazlarda çalıştığını gösteren iki ekran görüntüsü aşağıda yer almaktadır.

Android 2.3 cihazda çalışan sekmelere örnek (TabHelperEclair kullanılarak).
Android 4.0 cihazda çalışan sekmeler örneği (TabHelperHoneycomb kullanılarak).

Şekil 1. Android 2.3 cihazda (TabHelperEclair kullanılarak) ve Android 4.0 cihazda (TabHelperHoneycomb kullanılarak) çalışan, geriye dönük uyumlu sekmelerin örnek ekran görüntüleri.