Bu derste, yeni API'leri yansıtan ancak eski cihazları destekleyen bir uygulamanın nasıl oluşturulacağı ele alınmaktadır.
Alternatif bir çözüme karar verme
Yeni kullanıcı arayüzü özelliklerini geriye dönük uyumlu şekilde kullanırken en zor görev, eski platform sürümleri için eski (yedek) bir çözüme karar vermek ve bu çözümü uygulamaktır. Çoğu durumda, bu yeni kullanıcı arayüzü bileşenlerinin amacını yerine getirmek, eski kullanıcı arayüzü çerçevesi özelliklerini kullanarak mümkündür. Örnek:
-
İşlem çubukları, özel başlık çubukları veya etkinlik düzeninizdeki görünümler olarak resim düğmeleri içeren yatay bir
LinearLayout
kullanılarak uygulanabilir. Taşma işlemleri, cihazın Menü düğmesinin altında gösterilebilir. -
İşlem çubuğu sekmeleri, düğmeler içeren yatay bir
LinearLayout
veyaTabWidget
kullanıcı arayüzü öğesi kullanılarak uygulanabilir. -
NumberPicker
veSwitch
widget'ları, sırasıylaSpinner
veToggleButton
widget'ları kullanılarak uygulanabilir. -
ListPopupWindow
vePopupMenu
widget'ları,PopupWindow
widget'ları kullanılarak uygulanabilir.
Genellikle yeni kullanıcı arayüzü bileşenlerini eski cihazlara geri taşımak için herkese uygun tek bir çözüm yoktur. Kullanıcı deneyimine dikkat edin: Eski cihazlarda kullanıcılar yeni tasarım kalıplarına ve kullanıcı arayüzü bileşenlerine aşina olmayabilir. Aynı işlevin, tanıdık öğeler kullanılarak nasıl sunulabileceğine dair biraz düşünün. Uygulama ekosisteminde yeni kullanıcı arayüzü bileşenleri belirginse (ör. işlem çubuğu) veya etkileşim modelinin son derece basit ve sezgisel olduğu durumlarda (ör. ViewPager
kullanarak kaydırma görüntülemeleri) bu durum pek sorun oluşturmaz.
Eski API'leri kullanarak sekmeler uygulama
İşlem çubuğu sekmelerinin daha eski bir uygulamasını oluşturmak için TabWidget
ve TabHost
kullanabilirsiniz (ancak alternatif olarak yatay olarak düzenlenmiş Button
widget'ları da kullanılabilir). Bu uygulama, Android 2.0 (Eclair)'den daha sonra kullanıma sunulan API'leri kullandığından bu uygulamayı TabHelperEclair
ve CompatTabEclair
adlı sınıflarda uygulayın.
Bu depolama alanını işleyebilecek bir ActionBar.Tab
nesnesi olmadığından CompatTabEclair
uygulaması, sekme metni ve simgesi gibi sekme özelliklerini örnek değişkenlerinde 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
olmak üzere iki uygulamanız var: Android 3.0 veya sonraki sürümleri çalıştıran cihazlarda çalışan ve yeni API'ler kullanan bir uygulama, Android 2.0 veya sonraki sürümleri çalıştıran cihazlarda çalışan ve daha eski API'leri kullanan cihazlar. Bir sonraki derste, bu uygulamaları uygulamanızda nasıl kullanacağınızı öğreneceksiniz.