Ressources

Gestion des fichiers dans Android

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

La gestion des ressources (images, fichiers, styles...) sous Android permet de bien séparer la logique de l'application de la partie de vue. Une claire externalisation des ressources garantit non pas seulement une lisibilité plus accrue, mais aussi facilite l'adaptation de l'application à des spécifications (écrans, langues) différentes.

Ressources sous Android

Les ressources devraient être toujours externalisées (placées dans le répertoire /res). Cette externalisation rend l'affichage de l'application encore plus flexible. On peut imaginer par exemple que pour un utilisateur allemand on appliquera les layouts placés dans le dossier /res/layout-de et pour l'affichage normal on utilisera celui qui se trouve dans le répertoire par défaut, /res/layout. Cette distinction peut aider à mieux contrôler les habitudes d'utilisation en fonction du pays, de la taille ou de l'orientation de l'écran. Voici la liste des ressources disponibles sous Android :

res

animator

La configuration XML pour les éléments animés. Uniquement les animations property peuvent y être placés.

anim

Le XML pour les éléments animés tween. Les animations property peuvent y être placées aussi. Cependant /res/animator est préféré pour ce type d'animations pour garantir une meilleure clarté de structure. Pour voir la différence entre les deux types, consultez l'article sur les animations sous Android.

color

Le répertoire contient la liste des couleurs-états. Contrairement à /res/values/colors.xml, on peut y spécifier la couleur en héxadecimale, mais aussi les couleurs qui seront affichées à la suite du clique, de la sélection ou de vérouillage d'un élément portant ce code couleur.

drawable

Fichiers de bitmaps (.png, .jpg, .gif, .9) ou des fichiers XML qui définissent des éléments déssinés.

layout

Le répertoire avec les définitions des layouts.

menu

Le répertoire avec les définitions des menus.

raw

Il contient les fichiers sauvegardés sous le format raw.

values

De différentes valeurs peuvent y être stockées :

  • arrays.xml : pour les données représentées dans un tableau (par exemple une liste utilisée par Spinner)
  • colors.xml : pour les couleurs représentées par leurs valeurs héxadecimales (par exemple #000000 pour la couleur noire)
  • dimens.xml : pour les dimensions qui peuvent être utilisées pour spécifier la taille du texte ou la largeur d'un élément de layout. Les unités de mesure acceptées sont : dp, sp, pt, px, mm, in.
  • strings.xml : pour les chaînes de caractères (par exemple messages dans l'application)
  • styles.xml : pour les styles applicables à toutes les classes héritant du View (ressemblent un peu à des styles CSS dans le web)

xml

Ici on place les fichiers qui peuvent être lus au moment d'exécution de l'application via la méthode Resources.getXML(). Ce répertoire peut par exemple contenir une configuration pour la fonctionnalité de recherche.

Ressources alternatives sous Android

On a déjà évoqué la possibilité de fournir une ressource différente en fonction de l'environnement de l'utilisateur. On peut, par exemple, se baser sur sa langue et sur la taille de son écran pour lui présenter un écran totalement différent que, par exemple, pour la personne qui parle autre langue que lui et qui utilise un écran plus petit. Il s'agit donc des ressources alternatives.

Pour créer un répertoire de la ressource alternative, on doit ajouter les suffixes à des répertoires par défaut, cités dans le paragraphe précédent. Ces suffixes ont pris une nommination de qualifier names (noms qualificateurs). Voici la liste complète de ces noms :

Mobile Country Code (MCC) éventuellement suivi par Mobile Network Code (MNC) - langue - direction du layout - la largeur la plus petite - la largeur disponible - la hauteur disponible - la taille de l'écran - l'aspect de l'écran - orientation de l'écran - mode de l'interface utilisateur - mode de jour/nuit - densité des pixels sur l'écran (dpi) - type de l'écran - disponibilité du clavier - méthode d'introduction du texte - navigation - navigation non-toucheable (avec manettes ou outils externes) - plate-forme

Les ressources alternatives peuvent être composées de plusieurs codes. Cependant, les codes doivent être placés dans le même ordre que ci-dessus. Donc par exemple pour une traduction allemande pour l'API 3 on doit écrire values-de-v3 et non pas values-v3-de.

Ressources de l'application

Les ressources le plus souvent utilisées par notre application sont des ressources textuelles. Elles contiennent les messages à afficher en fonction de la langue de l'utilisateur. Elles sont placées dans /res/values-ISO, dans les fichiers strings.xml. Voici l'exemple de la définition d'un message :

<resources>
    <string name="label_account">My account
</resources>

Les autres ressources ne sont pas internationalisées. Donc par exemple si Android ne trouve pas une style dans /res/values-fr pour un utilisateur français, il va aller le récupérer dans le répertoire par défaut, res/values. Voici l'exemple d'une définition des styles pour des éléments clickables dans l'application (couleur noir et en gras) :

    <style name="clickable_text">
            <item name="android:textStyle">bold
            <item name="android:textColor">#000000
    </style>

Dans les dimensions on a défini les marges. Voici comment :

    <dimen name="activity_vertical_margin">16dp

Le dernier élément du répertoire /res/values défini contient des tableaux :

    <string-array name="langs">
        <item>@string/lang_fr</item>
        <item>@string/lang_en</item>
    </string-array>

Invoquer des ressources Android depuis le code

La récupération des ressources depuis le code de notre application est possible grâce au nommage des éléments (attribut name). Le modèle d'accèes est le suivant : (nom_package.)R.type_ressource.nom_ressource où :
- nom_package : si la ressource est chargée depuis un autre package que le nôtre, on doit spécifier son nom ici
- type_ressource : indique s'il s'agit d'une chaîne de caractères, d'une dimensions, d'un tableau, d'une couleur...; Voici la liste des relations entre le type et le code à utiliser :

Code Concerne
anim les animations du répertoire /res/anim
color les couleurs-états du répertoire /res/color/
drawable les animations et les dessins du répertoire /res/drawable/
layout les layouts
menu les menus
string les chaînes de caractère
style les styles

En plus, pour lire d'autres éléments placées dans /res/values (à part style et string mentionnés dans le tableau), il suffit d'indiquer le nom du fichier xml sans extension (par exemple bool pour les booléens, integer pour entiers)
- nom_ressource : correspondant à l'attribut name.

Voici les exemples de notre application qui lisent des ressources (resources est récupérée grâce à getResources()) :

refererUriEditText = (EditText) findViewById(R.id.prefRefererUri);

On récupère l'élément du layout par rapport à l'attribut android:id. En occurrence, on recherche l'élément avec l'identifiant prefRefererUri.

getMenuInflater().inflate(R.menu.main, menu);

On récupère le menu depuis /res/menu. Le fichier retrouvé est main.xml.

String dialogTitle = resources.getString(R.string.loading_title);

Il s'agit d'une chaîne de caractères nommée "loading_title".

tabHost = (TabHost)findViewById(android.R.id.tabhost);

L'exemple avec le nom du package spécifié. Il s'agit des éléments placés dans Android.

setContentView(R.layout.customize_book_list);

On récupère le layout pour le passer à l'activité.

view.setBackgroundColor(getResources().getColor(R.color.pomegranate));

On récupère la couleur et l'associe à une vue.

view.setBackground(getResources().getDrawable(R.drawable.black_bottom_border));

On associe une image de fond directement depuis /res/drawable. A la fin on retrouve le nom du fichier à charger (black_bottom_order.xml).

resources.getStringArray(R.array.langs);

On récupère le tableau des chaînes de caractères nommé "langs".

TODO : aborder ici la partie runtime changes

TODO : présenter plus en détails la ressource drawable, en tant qu'un moyen de rendre l'interface plus intuitive

Bartosz KONIECZNY Ressources des fichiers

Une question ? Une remarque ?

*

*

Un conseil JavaScript

Comment récupérer la hauteur de l'élément avec jQuery ?

On peut le faire avec deux méthodes. La première fonctionne correctement pour tous les navigateurs sauf Internet Explorer. Pour le cas des navigateurs Microsoft, elle marche uniquement quand la hauteur est spécifiée en dur :

$('#element').css('height')
L'alternative est la méthode height() qui est gérée par tous les navigateurs, même si l'élément a la hauteur "auto" :
$('#element').height();