Accès aux ressources Android

Il y a beaucoup de choses utilisées pour créer une excellente application Android. Outre le codage de l'application, vous devez vous concentrer sur diverses ressources, telles que divers contenus statiques que vous utilisez, comme les bitmaps, les couleurs, les définitions de mise en page, les chaînes d'interface utilisateur, les animations, etc. Ces ressources sont généralement placées dans des sous-répertoires indépendants sous le répertoire res/ du projet.

Ce tutoriel vous apprendra à organiser les ressources d'une application, à spécifier des ressources alternatives et à y accéder dans l'application.


Organisation des ressources dans Eclipse

Vous devez placer chaque ressource dans un sous-répertoire spécifique sous le répertoire res/ du projet. Par exemple, voici la hiérarchie des fichiers d'un projet simple :

MyProject/
    src/  
        MyActivity.java  
    res/
        drawable/  
            icon.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml 

Le répertoire res/ contient toutes les ressources dans divers sous-répertoires. Ici, il y a une ressource image, deux ressources de mise en page et un fichier de ressources de chaînes. Le tableau ci-dessous détaille les ressources prises en charge dans le répertoire res/ du projet.

Répertoire Type de ressource
anim/ Fichiers XML qui définissent les propriétés d'animation. Ils sont stockés dans le dossier res/anim/ et accessibles via la classe R.anim.
color/ Fichiers XML qui définissent des listes d'états de couleur. Ils sont stockés dans le dossier res/color/ et accessibles via la classe R.color.
drawable/ Les fichiers image, tels que les fichiers .png, .jpg, .gif ou XML, sont compilés en bitmaps, listes d'états, formes et images animées. Ils sont stockés dans le dossier res/drawable/ et accessibles via la classe R.drawable.
layout/ Fichiers XML qui définissent des mises en page d'interface utilisateur. Ils sont stockés dans le dossier res/layout/ et accessibles via la classe R.layout.
menu/ Fichiers XML qui définissent des menus d'application, tels que les menus d'options, les menus contextuels et les sous-menus. Ils sont stockés dans le dossier res/menu/ et accessibles via la classe R.menu.
raw/ Fichiers arbitraires enregistrés dans leur forme d'origine. Vous devez ouvrir les fichiers raw en appelant Resources.openRawResource() en fonction de l'ID de ressource nommé R.raw.filename.
values/ Fichiers XML contenant des valeurs simples (telles que des chaînes, des entiers, des couleurs, etc.). Voici quelques conventions de nommage de ressources dans les dossiers. arrays.xml représente les ressources de tableau, accessibles via la classe R.array ; integers.xml représente les ressources d'entiers, accessibles via la classe R.integer ; bools.xml représente les ressources booléennes, accessibles via la classe R.bool ; colors.xml représente les ressources de couleur, accessibles via la classe R.color ; dimens.xml représente les valeurs de dimension, accessibles via la classe R.dimen ; strings.xml représente les ressources de chaîne, accessibles via la classe R.string ; styles.xml représente les ressources de style, accessibles via la classe R.style.
xml/ Vous pouvez lire n'importe quel fichier XML au moment de l'exécution en appelant Resources.getXML(). Vous pouvez stocker divers fichiers de configuration utilisés au moment de l'exécution ici.

Ressources alternatives

Votre application doit fournir une prise en charge de ressources alternatives pour des configurations d'appareil spécifiques. Par exemple, vous devez fournir des ressources d'images alternatives pour différentes résolutions d'écran et des ressources de chaînes alternatives pour différentes langues. À l'exécution, Android détecte la configuration actuelle de l'appareil et charge les ressources appropriées pour l'application.

Pour déterminer un ensemble de ressources alternatives pour une configuration spécifique, suivez ces étapes :

  • Créez un nouveau répertoire sous res/, nommé au format <resource_name>_<config_qualifier>. Ici, resources_name est l'une des ressources mentionnées dans le tableau ci-dessus, telles que les mises en page, les images, etc. Le qualificatif déterminera quelles ressources sont utilisées pour la configuration spécifique. Vous pouvez consulter la documentation officielle pour obtenir une liste complète des qualificatifs pour différents types de ressources.
  • Enregistrez les ressources alternatives correspondantes dans ce répertoire. Ces fichiers de ressources doivent avoir les mêmes noms que les fichiers de ressources par défaut, comme indiqué dans l'exemple ci-dessous ; toutefois, ces fichiers remplaceront le contenu déterminé. Par exemple, bien que les noms des fichiers image soient identiques, pour les écrans à haute résolution, la résolution de l'image sera également élevée.

Voici un exemple de spécification d'une image d'écran par défaut et d'une image alternative à haute résolution.

MyProject/
   src/
    main/
    java/
       MyActivity.java  
       res/
          drawable/  
            icon.png
            background.png
        drawable-hdpi/  
            icon.png
            background.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml

Voici un autre exemple de spécification d'une mise en page de langue par défaut et d'une mise en page alternative en langue arabe.

MyProject/
   src/
    main/
    java/
       MyActivity.java  
      res/
         drawable/  
            icon.png
            background.png
        drawable-hdpi/  
            icon.png
            background.png  
        layout/  
            activity_main.xml
            info.xml
        layout-ar/
            main.xml
        values/  
            strings.xml

Accès aux ressources

Dans le développement d'applications, vous devez accéder aux ressources définies, que ce soit par code ou via des fichiers XML. Les sections suivantes décrivent comment accéder aux ressources dans ces deux scénarios respectivement.

Accès aux ressources dans le code

Lorsqu'une application Android est compilée, une classe R est générée et contient des ID pour toutes les ressources du répertoire res/. Vous pouvez utiliser la classe R pour accéder aux ressources par sous-classe + nom de ressource ou directement par ID de ressource.

Exemple

Pour accéder à res/drawable/myimage.png et l'affecter à un ImageView, vous utiliseriez le code suivant :

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

Ici, la première ligne de code utilise R.id.myimageview pour obtenir l'ImageView défini sous le nom myimageview dans le fichier de mise en page. La deuxième ligne utilise R.drawable.myimage pour obtenir l'image nommée myimage dans le sous-répertoire drawable de res/.

Exemple

Considérez l'exemple suivant, où res/values/strings.xml a la définition suivante :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string  name="hello">Hello, World!</string>
</resources>

Vous pouvez maintenant utiliser l'ID de ressource pour définir le texte sur l'objet TextView avec l'ID msg, comme suit :

TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);

Exemple

Considérez la mise en page définie comme res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:orientation="vertical" >

   <TextView android:id="@+id/text"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello, I am a TextView" />

   <Button android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello, I am a Button" />

</LinearLayout>

Ce code d'application chargera cette mise en page pour l'activité, dans la méthode onCreate() comme suit :

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main_activity);
}

Accès en XML

Considérez le fichier de ressources XML suivant res/values/strings.xml, qui contient une ressource de couleur et une ressource de chaîne -

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

Maintenant, vous pouvez utiliser ces ressources dans le fichier de mise en page ci-dessous pour définir la couleur du texte et le contenu du texte :

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

Maintenant, si vous revenez encore à l'exemple « Hello World! » expliqué dans le chapitre précédent, je suis sûr que vous comprendrez mieux tous les concepts de cette section. Par conséquent, je recommande vivement de revenir aux exemples précédents et de revoir l'utilisation de base des différentes ressources que j'ai utilisées.

Autres extensions