Sürüme duyarlı bileşeni kullanma

Artık biri Android 3.0 ve diğeri platformun önceki sürümleri için olmak üzere iki TabHelper ve CompatTab uygulamanız olduğuna göre, şimdi bu uygulamalarla bir şeyler yapabilirsiniz. Bu derste, bu uygulamalar arasında geçiş yapma mantığının oluşturulması, sürüme duyarlı düzenler oluşturma ve son olarak geriye uyumlu kullanıcı arayüzü bileşenini kullanma konuları ele alınmaktadır.

Geçiş mantığını ekleme

TabHelper soyut sınıfı, geçerli 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

Sonraki adım, etkinliğiniz için iki sekme uygulamasını destekleyebilecek düzenler sağlamaktır. Eski uygulama için (TabHelperEclair) etkinlik düzeninizin, sekme içerikleri için bir kapsayıcıyla birlikte TabWidget ve TabHost öğelerini 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>

Sekme göstergeleri ActionBar tarafından sağlandığından, TabHelperHoneycomb uygulaması için sekme içeriğini içerecek bir FrameLayout öğesine ihtiyacınız vardır:

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" />

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

Etkinliğinizde TabHelper'ı kullanma

Etkinliğinizin onCreate() yönteminde bir TabHelper nesnesi edinebilir ve aşağıdaki kodla 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);
}

Bu kod, uygulamayı çalıştırırken doğru etkinlik düzenini genişletir ve TabHelperHoneycomb veya TabHelperEclair nesnesini somutlaştırır. Gerçekte kullanılan somut sınıf, ortak TabHelper arayüzünü paylaştığından etkinlik için opaktır.

Aşağıda, Android 2.3 ve Android 4.0 cihazlarda çalışan bu uygulamanın iki ekran görüntüsü verilmiştir.

Android 2.3 cihazda (TabHelperEclair kullanılarak) çalışan sekmelerin örnek ekran görüntüsü. Android 4.0 cihazda (TabHelperHoneycomb kullanılarak) çalışan sekmelerin örnek ekran görüntüleri.

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