2012-02-05

Appliquer un theme en fonction de l'API

SignalSpam actuel fonctionnant sous ICS
Lorsqu'un projet conçu pour Android 2.X est affiché sur un terminal Android 3.X ou 4.X l'interface prend un coup de vieux. Même le android:hardwareAccelerated="true" du manifest.xml n'y peut rien, l'application n'aura pas le look'n'feel propre à Holo.

Il est possible de proposer plusieurs ressources différentes dans le même apk. Ce mécanisme est la base de l'internationalisation de votre application pour proposer une langue adaptée à vos lecteurs.

Dans le cas de SignalSpam, l’internationalisation ne présente aucun intérêt du fait de l'exclusivité Française du service 33700. Néanmoins lorsque Android supportera nos langues régionales (il faut surveiller cette page là ), je ferais le nécessaire ;)

Créer un thème abstrait

Dans mon manifest.xml, mon activity est déclarée comme suit :
<activity android:name=".Home" android:label="@string/app_name" android:theme="@android:style/Theme" > (...) </activity>
 (Ce n'est pas totalement vrai, c'est pour l'interet du blog)

Dans res/values/styles.xml je vais déclarer un nouveau thème.
<style name="theme_signalspam" parent="@android:style/Theme"> <item name="android:colorBackgroundCacheHint">@null</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowAnimationStyle">@android:style/Animation</item> <item name="android:windowNoTitle">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowFullscreen">true</item> <item name="android:textColor">@color/MAINCOLOR</item> </style>
Que je vais appliquer à mon manifest.xml en précisant que mon activité utilisera désormais theme_signalspam comme thème :
<activity android:name=".Home" android:label="@string/app_name" android:theme="@style/theme_signalspam" > (...) </activity>

Déclarer un thème spécifique aux Android récents.

Tout comme il est possible de suffixer un dossier de ressources par -fr pour les terminaux en Français, il est possible d'indiquer a Android d'utiliser une ressource plutôt qu'une autre si l'API est au moins égal à une valeur.

Comme l’oméga  du développement Android en matière d'UI est la version 15 je vais donc considérer que values contient le thème pour l'API 4 et pour chaque version contenant une exception j'utilise un dossier values-vX adapté.

Android utilise le values-vX dont le X correspond à son niveau d'API ou la plus proche par valeur inférieure. Exemple : un terminal avec Android 4.0.3 (API Level 15) utilisera prioritairement values-v15 si ce dossier existe OU SINON values-v14 OU SINON values-v13 ...
Réciproquement, un terminal sous Gingerbread 2.3.3 (API 10) ignore tous les dossiers values-vX dont le X est strictement supérieur à 10.
Donc pour viser TOUTES les versions d'Android supérieures à Honeycomb (level 11) il faudra utiliser values-v11.

Déclarer un thème Holo pour les Android 'Holo'

L'API level 15 apporte des choses sympathiques comme le widget switch et un meilleur aspect des widgets de type checkbox, néanmoins rien de tout ça n'est utilisé dans SignalSpam. Mes éléments commencent à l'API 11 avec le theme Holo.

Je travaille pour l'instant sur les deux extrêmes : visuels pour l'API 4 et visuels pour l'API 14. Le travail sur Honeycomb se limitera vraisemblablement au couleurs. On verra plus tard.

Je commence par cloner le dossier values en values-v11 et remplace
<style name="theme_signalspam" parent="@android:style/Theme">
par
<style name="theme_signalspam" parent="@android:style/Theme.Holo">

Rendu dans un émulateur

Grâce à ces modifications notre projet aura un rendu 2.3 lorsque exécuté sur un émulateur GingerBread et un look Holo sur un IceCreamSandwich.
Theme.Holo sur API 15 et Theme sur API 10

Aucun commentaire: