Utilisation des ressources
Les différents types de ressources
Les ressources d’un projet Android sont stockées dans des fichiers situés sous le répertoire res/ de l’arborescence. À l’exception des ressources brutes (res/raw/), tous les types de ressources sont analysés automatiquement, soit par le système de paquetages d’Android, soit par le système du terminal ou de l’émulateur. Si vous décrivez, par exemple, l’interface utilisateur d’une activité via une ressource de type layout (dans res/layout), vous n’avez pas besoin d’analyser vous-même le contenu du fichier XML – Android s’en chargera pour vous. Outre les layouts (que nous avons rencontrés pour la première fois au Chapitre 5) et les ressources brutes (introduites au Chapitre 18), il existe plusieurs autres types de ressources : ● Les animations (res/anim/) sont destinées aux animations courtes qui font partie de l’interface utilisateur : la simulation d’une page qui se tourne quand on clique sur un bouton, par exemple. L
L’art du développement Android
● Les images (res/drawable) permettent de placer des icônes statiques ou d’autres images dans une interface utilisateur. ● Les chaînes, les couleurs, les tableaux et les dimensions (res/values/) permettent d’associer des noms symboliques à ces types de constantes et de les séparer du reste du code (pour l’internationalisation et la localisation, notamment). ● Les fichiers XML statiques (res/xml/) permettent de stocker vos propres données et structures.
Théorie des chaînes
Placer les labels et les autres textes à l’extérieur du code source de l’application est, généralement, une très bonne idée. Ceci facilite, notamment, l’internationalisation (I18N) et la localisation (L10N), qui sont présentées un peu plus loin dans ce chapitre. Même si vous ne comptez pas traduire vos textes dans d’autres langues, cette séparation facilite les corrections car toutes les chaînes sont au même endroit au lieu d’être disséminées dans le code source. Android permet d’utiliser des chaînes externes classiques, mais également des « formats de chaînes », contenant des emplacements qui seront remplacés par des informations au cours de l’exécution. En outre, le formatage de texte simple, appelé « texte stylé », est également disponible, ce qui permet de mélanger des mots en gras ou en italique avec du texte normal.
Chaînes normales En règle générale, vous n’avez besoin pour les chaînes normales que d’un fichier XML situé dans le répertoire res/values (le plus souvent res/values/strings.xml). La racine de ce document est l’élément ressources, qui a autant de fils string qu’il y a de chaînes à encoder comme ressource. L’élément string a un attribut name, contenant le nom unique de la chaîne. Le contenu de cet élément est le texte de la chaîne : Portez ce vieux whisky… Le vif zéphir jubile… Le seul point épineux concerne la présence de guillemets (« ) ou d’apostrophes (’) dans le texte de la chaîne car vous devrez alors les protéger en les préfixant d’un antislash (il fait beau aujourd\’hui, par exemple).
Dans le cas de l’apostrophe, vous pouvez également placer tout le texte entre guillemets (« il fait beau aujourd’hui »). Vous pouvez ensuite faire référence à cette chaîne depuis un fichier de description (sous la forme @string/whisky, ou @string/zephir, par exemple) ou y accéder depuis votre Livre Android.book Page 200 Dimanche, 8. novembre 2009 12:23 12 customer 27921 at Fri Mar 11 19:19:45 +0100 2011 Propriété de Albiri Sigue Chapitre 19 Utilisation des ressources 201 code Java à l’aide de getString(), en lui passant l’identifiant de ressource de la chaîne, c’est-à-dire son nom unique préfixé par R.string (comme getString(R.string.whisky)). Formats de chaînes Comme les autres implémentations du langage Java, la machine virtuelle Dalvik d’Android reconnaît les formats de chaînes. Ces formats sont des chaînes contenant des marqueurs d’emplacements et seront remplacés lors de l’exécution par des données variables (Mon nom est %1$s, par exemple).
Les chaînes normales stockées sous forme de ressources peuvent être utilisées comme des formats de chaînes : String strFormat=getString(R.string.mon_nom); String strResult=String.format(strFormat, « Tim »); ((TextView)findViewById(R.id.un_label)) .setText(strResult); Texte stylé Pour enrichir du texte, vous pourriez utiliser des ressources brutes contenant du HTML, puis les placer dans un widget WebKit. Cependant, pour un formatage léger utilisant , et , une ressource chaîne fera l’affaire : Ce texte est en gras. Alors que celui-ci est en italiques ! Vous pouvez ensuite y accéder comme n’importe quelle autre chaîne normale, sauf que le résultat de l’appel à getString() sera ici un objet implémentant l’interface android.text.Spanned : ((TextView)findViewById(R.id.autre_label)) .setText(getString(R.string.i)); Formats stylés Les styles deviennent compliqués à gérer lorsqu’il s’agit de les utiliser avec les formats de chaînes. En effet, String.format() s’applique à des objets String, pas à des objets Spanned disposant d’instructions de formatage. Si vous avez vraiment besoin de formats de chaînes stylés, vous pouvez suivre ces étapes :
1. Dans la ressource chaîne, remplacez les chevrons par des entités HTML (Je suis <b>%1$s</b>, par exemple). 2. Récupérez la ressource comme d’habitude, bien qu’elle ne soit pas encore stylée (avec getString(R.string.format_style)). Livre Android.book Page 201 Dimanche, 8. novembre 2009 12:23 12 customer 27921 at Fri Mar 11 19:19:45 +0100 2011 Propriété de Albiri Sigue 202 L’art du développement Android 3. Produisez le résultat du formatage, en vous assurant de protéger les valeurs de chaînes que vous substituez, au cas où elles contiendraient des chevrons ou des esperluettes : String.format(getString(R.string.format_style), TextUtils.htmlEncode(nom)); 4. Convertissez le HTML encodé en objet Spanned grâce à Html.fromHtml(). uneTextView.setText(Html.fromHtml(resultatDeStringFormat)); Pour voir tout ceci en action, examinons le fichier de description du projet Resources/ Strings : Comme vous pouvez le constater, l’interface utilisateur n’est composée que d’un bouton, d’un champ et d’un label. Le but est que l’utilisateur entre son nom dans le champ puis clique sur le bouton pour que le label soit remplacé par un message formaté contenant ce nom. L’élément Button de ce fichier faisant référence à une ressource chaîne (@string/ btn_name), nous avons besoin d’un fichier de ressource chaîne (res/values/strings.xml) : StringsDemo Nom : Je suis <b>%1$s</b>