Mengabstraksi API baru

Misalnya Anda ingin menggunakan tab panel tindakan sebagai bentuk utama navigasi tingkat atas dalam aplikasi. Sayangnya, API ActionBar hanya tersedia di Android 3.0 atau versi yang lebih baru (API level 11+). Jadi, jika Anda ingin mendistribusikan aplikasi ke perangkat yang menjalankan versi platform sebelumnya, Anda harus memberikan implementasi yang mendukung API yang lebih baru sekaligus memberikan mekanisme penggantian yang menggunakan API lama.

Di kelas ini, Anda akan membuat komponen antarmuka pengguna (UI) tab yang menggunakan class abstrak dengan penerapan spesifik versi untuk memberikan kompatibilitas dengan versi sebelumnya. Tutorial ini menjelaskan cara membuat lapisan abstraksi untuk API tab baru sebagai langkah pertama dalam membuat komponen tab.

Menyiapkan abstraksi

Abstraksi dalam bahasa pemrograman Java melibatkan pembuatan satu atau beberapa antarmuka atau class abstrak untuk menyembunyikan detail penerapan. Untuk Android API baru, Anda dapat menggunakan abstraksi untuk membuat komponen berbasis versi yang menggunakan API saat ini pada perangkat baru, dan melakukan fallback ke API lama yang lebih kompatibel di perangkat lama.

Saat menggunakan pendekatan ini, terlebih dahulu tentukan class baru yang ingin Anda gunakan dengan cara yang kompatibel dengan versi sebelumnya, lalu buat class abstrak, berdasarkan antarmuka publik class baru. Dalam mendefinisikan antarmuka abstraksi, Anda harus menduplikasi API baru sebanyak mungkin. Hal ini akan memaksimalkan kompatibilitas dengan versi baru dan mempermudah pelepasan lapisan abstraksi di masa mendatang jika tidak lagi diperlukan.

Setelah membuat class abstrak untuk API baru tersebut, penerapan dapat dibuat dan dipilih pada waktu proses, berapa pun jumlahnya. Untuk kompatibilitas dengan versi sebelumnya, penerapan ini dapat bervariasi menurut API level yang diperlukan. Jadi, satu penerapan dapat menggunakan API yang baru dirilis, sementara yang lain dapat menggunakan API lama.

Membuat antarmuka tab abstrak

Untuk membuat versi tab yang kompatibel dengan versi sebelumnya, Anda harus menentukan fitur dan API tertentu yang diperlukan aplikasi Anda terlebih dahulu. Untuk tab bagian level atas, anggaplah Anda memiliki persyaratan fungsional berikut:

  1. Indikator tab harus menampilkan teks dan ikon.
  2. Tab dapat dikaitkan dengan instance fragmen.
  3. Aktivitas harus dapat memroses perubahan tab.

Dengan menyiapkan persyaratan ini di awal, Anda dapat mengontrol cakupan lapisan abstraksi. Artinya, Anda dapat menghemat waktu untuk membuat beberapa penerapan lapisan abstrak dan mulai menggunakan penerapan yang kompatibel dengan versi sebelumnya secara lebih cepat.

API utama untuk tab berada di ActionBar dan ActionBar.Tab. Ini adalah API yang harus diabstraksi untuk membuat tab Anda berbasis versi. Persyaratan untuk project contoh ini memanggil kompatibilitas balik ke Eclair (API level 5) dan di saat bersamaan memanfaatkan fitur tab baru di Honeycomb (API Level 11). Diagram struktur class untuk mendukung kedua penerapan dan class dasar abstraknya (atau antarmuka) ditampilkan di bawah ini.

Diagram class untuk class dasar abstrak dan implementasi khusus versi.

Gambar 1. Diagram class untuk class dasar abstrak dan implementasi khusus versi.

Mengabstraksi ActionBar.Tab

Mulai pembuatan lapisan abstraksi tab dengan membuat class abstrak yang mewakili tab, yang mencerminkan antarmuka ActionBar.Tab:

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

Anda dapat menggunakan class abstrak, bukan antarmuka di sini untuk menyederhanakan penerapan fitur umum seperti pengaitan objek tab dengan aktivitas (tidak ditampilkan dalam cuplikan kode).

Mengabstraksi metode tab ActionBar

Selanjutnya, tentukan class abstrak yang memungkinkan Anda membuat dan menambahkan tab ke aktivitas, seperti ActionBar.newTab() dan ActionBar.addTab():

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);

    ...
}

Pada tutorial berikutnya, Anda akan membuat penerapan untuk TabHelper dan CompatTab yang berfungsi di versi platform lama dan baru.

Anda juga harus membaca