Tutorial ini menunjukkan cara membuat subclass dari class abstrak CompatTab
dan TabHelper
serta menggunakan API baru. Aplikasi Anda dapat menggunakan implementasi ini pada perangkat yang menjalankan versi platform yang mendukungnya.
Mengimplementasikan tab menggunakan API baru
Class konkret untuk CompatTab
dan TabHelper
yang menggunakan API terbaru merupakan implementasi proxy. Karena class abstrak yang dijelaskan dalam tutorial sebelumnya mencerminkan API baru (struktur class, tanda tangan metode, dll.), class konkret yang menggunakan API baru ini hanya menerapkan proxy pada panggilan metode dan hasilnya.
Anda dapat langsung menggunakan API baru di class concrete ini, dan tidak error di perangkat sebelumnya, karena pemuatan class yang lama. Class dimuat dan diinisialisasi pada akses pertama, dengan membuat instance class atau mengakses salah satu kolom maupun metode statisnya untuk pertama kalinya. Jadi, selama Anda tidak membuat instance implementasi spesifik Honeycomb pada perangkat pre-Honeycomb, VM Dalvik tidak akan memunculkan pengecualian VerifyError
apa pun.
Konvensi penamaan yang baik untuk implementasi ini adalah dengan menambahkan level API atau nama kode versi platform yang sesuai dengan API yang diperlukan oleh class konkret. Misalnya, implementasi tab native dapat disediakan oleh class CompatTabHoneycomb
dan TabHelperHoneycomb
, karena mengandalkan API yang tersedia di Android 3.0 (API level 11) atau yang lebih baru.
![Diagram class untuk penerapan Honeycomb pada tab.](https://developer.android.com/static/images/training/backward-compatible-ui-classes-honeycomb.png?authuser=8&hl=id)
Gambar 1. Diagram class untuk penerapan Honeycomb pada tab.
Mengimplementasikan CompatTabHoneycomb
CompatTabHoneycomb
adalah implementasi dari class abstrak CompatTab
yang digunakan oleh TabHelperHoneycomb
untuk mereferensikan masing-masing tab. CompatTabHoneycomb
cukup membuat proxy semua panggilan metode ke objek ActionBar.Tab
yang ada di dalamnya.
Mulai mengimplementasikan CompatTabHoneycomb
menggunakan API ActionBar.Tab
baru:
Kotlin
class CompatTabHoneycomb internal constructor(val activity: Activity, tag: String) : CompatTab(tag) { ... // The native tab object that this CompatTab acts as a proxy for. private var mTab: ActionBar.Tab = // Proxy to new ActionBar.newTab API activity.actionBar.newTab() override fun setText(@StringRes textId: Int): CompatTab { // Proxy to new ActionBar.Tab.setText API mTab.setText(textId) return this } ... // Do the same for other properties (icon, callback, etc.) }
Java
public class CompatTabHoneycomb extends CompatTab { // The native tab object that this CompatTab acts as a proxy for. ActionBar.Tab mTab; ... protected CompatTabHoneycomb(FragmentActivity activity, String tag) { ... // Proxy to new ActionBar.newTab API mTab = activity.getActionBar().newTab(); } public CompatTab setText(int resId) { // Proxy to new ActionBar.Tab.setText API mTab.setText(resId); return this; } ... // Do the same for other properties (icon, callback, etc.) }
Mengimplementasikan TabHelperHoneycomb
TabHelperHoneycomb
adalah implementasi dari class abstrak TabHelper
yang membuat proxy panggilan metode ke ActionBar
aktual, yang diperoleh dari Activity
yang ada di dalamnya.
Implementasikan TabHelperHoneycomb
, yang membuat proxy panggilan metode ke ActionBar
API:
Kotlin
class TabHelperHoneycomb internal constructor(activity: FragmentActivity) : TabHelper(activity) { private var mActionBar: ActionBar? = null override fun setUp() { mActionBar = mActionBar ?: mActivity.actionBar.apply { navigationMode = ActionBar.NAVIGATION_MODE_TABS } } override fun addTab(tab: CompatTab) { // Tab is a CompatTabHoneycomb instance, so its // native tab object is an ActionBar.Tab. mActionBar?.addTab(tab.getTab() as ActionBar.Tab) } }
Java
public class TabHelperHoneycomb extends TabHelper { ActionBar actionBar; ... protected void setUp() { if (actionBar == null) { actionBar = activity.getActionBar(); actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_TABS); } } public void addTab(CompatTab tab) { ... // Tab is a CompatTabHoneycomb instance, so its // native tab object is an ActionBar.Tab. actionBar.addTab((ActionBar.Tab) tab.getTab()); } // The other important method, newTab() is part of // the base implementation. }