Supposons que vous souhaitiez utiliser les onglets de la barre d'action comme forme principale de navigation de premier niveau dans votre application. Malheureusement, les API ActionBar
ne sont disponibles que sur Android 3.0 ou version ultérieure (niveau d'API 11 ou version ultérieure). Ainsi, si vous souhaitez distribuer votre application sur des appareils exécutant des versions antérieures de la plate-forme, vous devez fournir une implémentation compatible avec la nouvelle API, tout en fournissant un mécanisme de secours qui utilise d'anciennes API.
Dans cette classe, vous allez créer un composant d'interface utilisateur (UI) à onglets qui utilise des classes abstraites avec des implémentations spécifiques à chaque version pour assurer la rétrocompatibilité. Cette leçon explique comment créer une couche d'abstraction pour les API du nouvel onglet. Il s'agit de la première étape de la création du composant d'onglet.
Se préparer à l'abstraction
Dans le langage de programmation Java, l'abstraction implique la création d'une ou plusieurs interfaces ou classes abstraites pour masquer les détails de l'implémentation. Dans le cas des API Android les plus récentes, vous pouvez utiliser l'abstraction pour créer des composants compatibles avec les versions qui utilisent les API actuelles sur les appareils plus récents, et revenir à des API plus anciennes et plus compatibles sur les appareils plus anciens.
Lorsque vous utilisez cette approche, vous déterminez d'abord quelles nouvelles classes vous souhaitez pouvoir utiliser de manière rétrocompatible, puis vous créez des classes abstraites en vous basant sur leurs interfaces publiques. Lorsque vous définissez les interfaces d'abstraction, vous devez mettre en miroir autant que possible la nouvelle API. Cela optimise la compatibilité ascendante et permet de supprimer plus facilement la couche d'abstraction lorsque celle-ci n'est plus nécessaire.
Après avoir créé des classes abstraites pour ces nouvelles API, vous pouvez créer et choisir un nombre illimité d'implémentations au moment de l'exécution. Pour des raisons de rétrocompatibilité, ces implémentations peuvent varier en fonction du niveau d'API requis. Ainsi, une implémentation peut utiliser des API récemment publiées, tandis que d'autres peuvent utiliser des API plus anciennes.
Créer une interface d'onglet abstraite
Pour créer une version rétrocompatible des onglets, vous devez d'abord déterminer les fonctionnalités et les API spécifiques requises par votre application. Dans le cas des onglets de section de premier niveau, supposons que vous disposiez des exigences fonctionnelles suivantes:
- Les indicateurs d'onglet doivent afficher du texte et une icône.
- Les onglets peuvent être associés à une instance de fragment.
- L'activité doit pouvoir écouter les changements d'onglet.
La préparation de ces exigences à l'avance vous permet de contrôler le champ d'application de votre couche d'abstraction. Cela signifie que vous pouvez passer moins de temps à créer plusieurs implémentations de votre couche d'abstraction et commencer à utiliser votre nouvelle implémentation rétrocompatible plus tôt.
Les principales API pour les onglets se trouvent dans ActionBar
et ActionBar.Tab
. Il s'agit des API à extraire afin que vos onglets tiennent compte des versions. Les exigences de cet exemple de projet requièrent la compatibilité avec Eclair (niveau d'API 5) tout en tirant parti des fonctionnalités du nouvel onglet dans Honeycomb (niveau d'API 11). Vous trouverez ci-dessous un schéma de la structure de classe permettant de prendre en charge ces deux implémentations et de leurs classes de base (ou interfaces) abstraites.
Barre d'action abstraite.Tab
Commencez à créer une couche d'abstraction d'onglet en créant une classe abstraite représentant un onglet, qui reflète l'interface ActionBar.Tab
:
Kotlin
sealed class CompatTab(val tag: String) { ... abstract fun getText(): CharSequence abstract fun getIcon(): Drawable abstract fun getCallback(): CompatTabListener abstract fun getFragment(): Fragment abstract fun setText(text: String): CompatTab abstract fun setIcon(icon: Drawable): CompatTab abstract fun setCallback(callback: CompatTabListener): CompatTab abstract fun setFragment(fragment: Fragment): CompatTab ... }
Java
public abstract class CompatTab { ... public abstract CompatTab setText(int resId); public abstract CompatTab setIcon(int resId); public abstract CompatTab setTabListener( CompatTabListener callback); public abstract CompatTab setFragment(Fragment fragment); public abstract CharSequence getText(); public abstract Drawable getIcon(); public abstract CompatTabListener getCallback(); public abstract Fragment getFragment(); ... }
Vous pouvez utiliser une classe abstraite ici au lieu d'une interface pour simplifier l'implémentation de fonctionnalités courantes telles que l'association d'objets d'onglet à des activités (non présentées dans l'extrait de code).
Méthodes d'onglet de la barre d'action abstraite
Ensuite, définissez une classe abstraite qui vous permet de créer et d'ajouter des onglets à une activité, comme ActionBar.newTab()
et ActionBar.addTab()
:
Kotlin
sealed class TabHelper(protected val activity: FragmentActivity) { ... abstract fun setUp() fun newTab(tag: String): CompatTab { // This method is implemented in a later lesson. } abstract fun addTab(tab: CompatTab) ... }
Java
public abstract class TabHelper { ... public CompatTab newTab(String tag) { // This method is implemented in a later lesson. } public abstract void addTab(CompatTab tab); ... }
Dans les leçons suivantes, vous allez créer des implémentations pour TabHelper
et CompatTab
, qui fonctionnent à la fois avec les anciennes et les nouvelles versions de la plate-forme.