Cette leçon explique comment créer une implémentation qui reflète les API les plus récentes, tout en prenant en charge les appareils plus anciens.
Choisir une solution de remplacement
La tâche la plus difficile lors de l'utilisation des nouvelles fonctionnalités d'interface utilisateur de manière rétrocompatible consiste à choisir et à implémenter une ancienne solution (de remplacement) pour les anciennes versions de la plate-forme. Dans de nombreux cas, il est possible de remplir l'objectif de ces nouveaux composants d'UI à l'aide de fonctionnalités plus anciennes du framework d'UI. Par exemple :
-
Vous pouvez implémenter des barres d'action à l'aide d'un
LinearLayout
horizontal contenant des boutons d'image, soit sous forme de barres de titre personnalisées, soit sous forme de vues dans la mise en page de votre activité. Les actions de dépassement sont accessibles via le bouton Menu de l'appareil. -
Vous pouvez implémenter les onglets de la barre d'action à l'aide d'un
LinearLayout
horizontal contenant des boutons, ou à l'aide de l'élément d'interface utilisateurTabWidget
. -
Les widgets
NumberPicker
etSwitch
peuvent être implémentés à l'aide des widgetsSpinner
etToggleButton
, respectivement. -
Les widgets
ListPopupWindow
etPopupMenu
peuvent être implémentés à l'aide de widgetsPopupWindow
.
Il n'existe généralement pas de solution unique pour rétroporter des composants d'interface utilisateur plus récents sur des appareils plus anciens. Soyez attentif à l'expérience utilisateur: sur les appareils plus anciens, les utilisateurs peuvent ne pas être familiers avec les modèles de conception et les composants d'interface utilisateur plus récents. Réfléchissez à la façon dont vous pouvez proposer la même fonctionnalité à l'aide d'éléments familiers. Dans de nombreux cas, cela est moins préoccupant, si des composants d'interface utilisateur plus récents sont proéminents dans l'écosystème d'applications (comme la barre d'action) ou lorsque le modèle d'interaction est extrêmement simple et intuitif (par exemple, des vues à balayer avec un ViewPager
).
Implémenter des onglets à l'aide d'anciennes API
Pour créer une ancienne implémentation des onglets de la barre d'action, vous pouvez utiliser TabWidget
et TabHost
(bien qu'il soit également possible d'utiliser des widgets Button
disposés horizontalement). Implémentez cela dans les classes appelées TabHelperEclair
et CompatTabEclair
, car cette implémentation utilise des API introduites à partir d'Android 2.0 (Eclair).
![Schéma de classe pour l'implémentation des onglets dans Eclair.](https://developer.android.google.cn/static/images/training/backward-compatible-ui-classes-eclair.png?authuser=5&hl=fr)
Figure 1 : Schéma de classe pour l'implémentation des onglets dans Eclair.
L'implémentation de CompatTabEclair
stocke les propriétés des onglets, comme le texte et l'icône de l'onglet, dans des variables d'instance, car aucun objet ActionBar.Tab
n'est disponible pour gérer ce stockage:
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.) }
L'implémentation de TabHelperEclair
utilise des méthodes sur le widget TabHost
pour créer des objets TabHost.TabSpec
et des indicateurs d'onglet:
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. }
Vous disposez désormais de deux implémentations de CompatTab
et TabHelper
: l'une fonctionne sur les appareils équipés d'Android 3.0 ou version ultérieure avec de nouvelles API, et l'autre sur les appareils équipés d'Android 2.0 ou version ultérieure et utilisant d'anciennes API. La leçon suivante explique comment utiliser ces implémentations dans votre application.