Bu derste, daha yeni API'leri yansıtan ancak eski cihazları destekleyen bir uygulamanın nasıl oluşturulacağı açıklanmaktadır.
Alternatif bir çözüme karar verme
Yeni kullanıcı arayüzü özelliklerini geriye dönük uyumlu bir şekilde kullanırken karşılaşılan en zorlu görev, eski platform sürümleri için eski bir (yedek) çözüme karar vermek ve bu çözümü uygulamaktır. Çoğu durumda, bu yeni kullanıcı arayüzü bileşenlerinin amacını eski kullanıcı arayüzü çerçevesi özelliklerini kullanarak yerine getirmek mümkündür. Örneğin:
-
İşlem çubukları, resim düğmeleri içeren yatay bir
LinearLayoutkullanılarak özel başlık çubukları veya etkinlik düzeninizdeki görünümler olarak uygulanabilir. Taşma işlemleri, cihazın Menü düğmesi altında gösterilebilir. -
İşlem çubuğu sekmeleri, düğmeler içeren yatay bir
LinearLayoutkullanılarak veyaTabWidgetkullanıcı arayüzü öğesi kullanılarak uygulanabilir. -
NumberPickerveSwitchwidget'ları sırasıylaSpinnerveToggleButtonwidget'ları kullanılarak uygulanabilir. -
ListPopupWindowvePopupMenuwidget'ları,PopupWindowwidget'ları kullanılarak uygulanabilir.
Genellikle yeni kullanıcı arayüzü bileşenlerini eski cihazlara geri aktarmak için herkese uygun tek bir çözüm yoktur. Kullanıcı deneyimine dikkat edin: Kullanıcılar, eski cihazlarda yeni tasarım kalıplarına ve kullanıcı arayüzü bileşenlerine alışkın olmayabilir. Aynı işlevin, bilinen öğeler kullanılarak nasıl sunulabileceğini düşünün. Yeni kullanıcı arayüzü bileşenleri uygulama ekosisteminde belirginse (ör. işlem çubuğu) veya etkileşim modeli basit ve sezgisel olduğunda (ör. ViewPager kullanılarak kaydırılan görünümler) bu durum çoğu zaman daha az sorun yaratır.
Eski API'leri kullanarak sekmeler uygulama
İşlem çubuğu sekmelerinin eski bir uygulamasını oluşturmak için TabWidget ve TabHost kullanabilirsiniz (alternatif olarak yatay yerleştirilmiş Button widget'ları da kullanılabilir). Bu uygulama, Android 2.0 (Eclair) sürümünden sonra kullanıma sunulmayan API'leri kullandığından bu uygulamayı TabHelperEclair ve CompatTabEclair adlı sınıflarda uygulayın.
Bu depolamayı işleyecek bir ActionBar.Tab nesnesi olmadığından CompatTabEclair uygulaması, sekme metni ve simgesi gibi sekme özelliklerini örnek değişkenlerde depolar:
Kotlin
class CompatTabEclair internal constructor(val activity: FragmentActivity, tag: String) : CompatTab(tag) { // Store these properties in the instance, // as there is no ActionBar.Tab object. private var text: CharSequence? = null ... override fun setText(resId: Int): CompatTab { // Our older implementation simply stores this // information in the object instance. text = activity.resources.getText(resId) return this } ... // Do the same for other properties (icon, callback, etc.) }
Java
public class CompatTabEclair extends CompatTab { // Store these properties in the instance, // as there is no ActionBar.Tab object. private CharSequence text; ... public CompatTab setText(int resId) { // Our older implementation simply stores this // information in the object instance. text = activity.getResources().getText(resId); return this; } ... // Do the same for other properties (icon, callback, etc.) }
TabHelperEclair uygulaması, TabHost.TabSpec nesneleri ve sekme göstergeleri oluşturmak için TabHost widget'ındaki yöntemleri kullanır:
Kotlin
class TabHelperEclair internal constructor(activity: FragmentActivity) : TabHelper(activity) { private var tabHost: TabHost? = null ... override fun setUp() { // Our activity layout for pre-Honeycomb devices // must contain a TabHost. tabHost = tabHost ?: mActivity.findViewById<TabHost>(android.R.id.tabhost).apply { setup() } } override fun addTab(tab: CompatTab) { ... tabHost?.newTabSpec(tab.tag)?.run { setIndicator(tab.getText()) // And optional icon ... tabHost?.addTab(this) } } // The other important method, newTab() is part of // the base implementation. }
Java
public class TabHelperEclair extends TabHelper { private TabHost tabHost; ... protected void setUp() { if (tabHost == null) { // Our activity layout for pre-Honeycomb devices // must contain a TabHost. tabHost = (TabHost) mActivity.findViewById( android.R.id.tabhost); tabHost.setup(); } } public void addTab(CompatTab tab) { ... TabSpec spec = tabHost .newTabSpec(tag) .setIndicator(tab.getText()); // And optional icon ... tabHost.addTab(spec); } // The other important method, newTab() is part of // the base implementation. }
Artık CompatTab ve TabHelper için iki uygulama var: Biri Android 3.0 veya sonraki sürümlerin yüklü olduğu cihazlarda çalışan ve yeni API'leri kullanan, diğeri ise Android 2.0 veya sonraki sürümlerin yüklü olduğu cihazlarda çalışan ve eski API'leri kullanan. Bir sonraki derste, bu uygulamaları uygulamanızda kullanma konusu ele alınmaktadır.