Bu derste, CompatTab
ve TabHelper
soyut sınıflarını nasıl alt sınıflandıracağınız ve yeni API'leri nasıl kullanacağınız gösterilmektedir. Uygulamanız bu uygulamayı, destekleyen bir platform sürümü çalıştıran cihazlarda kullanabilir.
Yeni API'leri kullanarak sekmeleri uygulayın
CompatTab
ve TabHelper
için daha yeni API'ler kullanan somut sınıflar, proxy uygulamasıdır. Bir önceki derste tanımlanan soyut sınıflar, yeni API'leri (sınıf yapısı, yöntem imzaları vb.) yansıttığından, söz konusu yeni API'leri kullanan somut sınıflar, proxy yöntemi çağrıları ve bunların sonuçlarını yansıtmaktadır.
Geç sınıf yüklemeleri nedeniyle yeni API'leri doğrudan bu somut sınıflarda kullanabilir ve önceki cihazlarda kilitlenme yaşayamazsınız. Sınıflar, ilk erişimde yüklenir ve başlatılır. Böylece, sınıfın statik alanlarından veya yöntemlerinden birine ilk kez erişilir. Bu nedenle, petek öncesi cihazlarda Honeycomb'a özgü uygulamaları örneklendirmediğiniz sürece Dalvik sanal makinesi herhangi bir VerifyError
istisnası devreye girmez.
Bu uygulama için iyi bir adlandırma kuralı, somut sınıfların gerektirdiği API'lere karşılık gelen API düzeyi veya platform sürümü kodu adını eklemektir. Örneğin, yerel sekme uygulaması CompatTabHoneycomb
ve TabHelperHoneycomb
sınıfları tarafından sağlanabilir, çünkü bu sınıflar Android 3.0 (API düzeyi 11) veya sonraki sürümlerde bulunan API'leri temel alır.
![Sekmelerin Honeycomb uygulaması için sınıf diyagramı.](https://developer.android.com/static/images/training/backward-compatible-ui-classes-honeycomb.png?authuser=5&hl=tr)
Şekil 1. Sekmelerin Honeycomb uygulaması için sınıf diyagramı.
CompatTabHoneycomb'ı Uygulama
CompatTabHoneycomb
, TabHelperHoneycomb
tarafından ayrı sekmelere referansta bulunmak için kullanılan CompatTab
soyut sınıfının uygulanmasıdır. CompatTabHoneycomb
, tüm yöntem çağrılarını içerdiği ActionBar.Tab
nesnesine proxy uygular.
Yeni ActionBar.Tab
API'lerini kullanarak CompatTabHoneycomb
uygulamasını uygulamaya başlayın:
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.) }
TabHelperHoneycomb'ı uygulama
TabHelperHoneycomb
, proxy yönteminin içerdiği Activity
öğesinden alınan gerçek bir ActionBar
öğesine çağırdığı TabHelper
soyut sınıfının uygulanmasıdır.
ActionBar
API'sine proxy yaparak TabHelperHoneycomb
yöntemini uygulayın:
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. }