13 mai 2014

Android - Structure d'un projet et Ressources

Structure d'un projet

Un projet Android est structuré de la manière suivante :
  • AndroidManifest.xml : fichier principal à la racine du projet qui définit les informations et les composants de l'application
  • src : répertoire contenant le code source Java
  • res : répertoire des ressources statiques
  • gen : répertoire et fichiers générés automatiquement par l'IDE (dont la classe R)

AndroidManifest.xml

Ce fichier est le fichier principal de l'application qui définit les informations suivantes :
  • nom du package Java de base des classes de l'application
  • les composants de l'application : activités, services, etc.
  • les permissions requises par l'application pour accéder aux éléments du système
  • les permissions d'accès à l'application par les autres applications
  • indique la version minimale de l'API Android qui est requise par l'application
  • les librairies requises par l'application

Structure

Le fichier AndroidManifest.xml est structuré de la manière suivante :
  • <manifest> : (racine du AndroidManifest.xml)
    • package : package de base de l'application
      • Ce nom doit être unique
      • Ce nom sert de préfixe lorsque le nom de la classe est précédé d'un point : .[Classe Java], pour les éléments définis dans <application>
    • versionCode : numéro de version de l'application
    • versionName : nom de la version
    • installLocation : lieu d'installation de l'application :
      • internalOnly : stockage interne
      • auto : stockage interne ou carte SD
      • preferExternal : carte SD de préférence

Version du SDK

  • <uses_sdk> : définit la version du SDK Android requise par l'application
    • minSdkVersion : version minimale du SDK Android pour que l'application soit installée
    • targetSdkVersion : version du SDK Android utilisée pour valider le fonctionnement de l'application. Cela permet d'activer le mode compatibilité d'Android vers cette version si la version installée sur l'appareil est plus récente.

Composants de l'application

  • <application> : (obligatoire) définit les composants de l'application

Activité

  • <application>
      • <activity> : activité (classe Activity)
        • <intent-filter> : messages Intent qui peuvent lancer l'activité
          • exemple : activité qui est utilisée au démarrage de l'application
            <activity android:name=".MainActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
          • exemple : activité qui est lancée depuis une autre activité
            <activity android:name=".MailListActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                </intent-filter>
            </activity>

    Service

    • <application>
        • <service> : service (classe Service)
          • <intent-filter> : messages Intent qui peuvent lancer l'exécution d'un traitement par un service

      Content Provider

      • <application>
          • <provider> : fournisseur de contenu (classe ContentProvider) : expose les données sous une forme similaire au service REST
            • authorities : nom de l'autorisation pour accéder au fournisseur de contenu

        Broadcast receiver

        • <application>
          • <receiver> : récepteur de diffusion (classe BroadcastReceiver) : il est à l'écoute des messages Intent diffusés pour tous les composants même si l'application n'est pas démarré. Le récepteur est capable de démarrer l'application si celle-ci était arrêtée
            • <intent-filter> : messages Intent qui peuvent lancer l'exécution du récepteur BroadcastReceiver de l'application même si cette application est actuellement arrêtée
              • <receiver android:name=”.IntentReceiver”>
                    <intent-filter>
                       <action android:name=”com.bookstore.broadcastAction” />
                    </intent-filter>
                </receiver>

        Librairies

        • <application>
          • <uses_library> : librairies partagées qui sont liées à l'application. 
            • C'est pour éviter d'installer une application sans cette librairie ou de supprimer une librairie utilisée par une application.

        Autorisations

        • <uses_permission> : autorisations requises par l'application (ex: recevoir des SMS)
        • <permission> : autorisations d'accès aux composants de l'application par des composants externes à l'application

        Support matériel

        • <uses_configuration> : liste les modes de saisie des actions de l'utilisateur (clavier, écran tactile, etc.) requises par l'application
        • <uses_feature> : liste les fonctionnalités obligatoires ou facultatives requises par l'application (audio, bluetooth, camera, microphone, GPS, NFC, téléphone, écran tactile, USB, WiFi, etc.)
        • <support_screens> : résolution supportée par l'application
          • smallScreens : résolution inférieure à HVGA
          • normalScreens : résolution HVGA et plus : WVGA, WQVGA
          • largeScreens : résolution plus large que la normale 
          • xlargeScreens : résolution plus large qu'une tablette normale
          • requiresSmallestWidthDp : largeur minimale en pixel requise par l'application
          • compatibleWidthLimitDp : largeur maximale en pixel au-delà de laquelle l'interface graphique de l'application n'est plus élargie
          • largestWidthLimitDp : largeur maximale en pixel

        Test

        • <instrumentation> : permet de définir une classe Java qui va servir à valider une application actuellement en fonctionnement

        Ressources

        Le répertoire des ressources res contient les sous-répertoires suivants :

        Valeurs simples

        • res/values :
          • fichiers XML contenant des valeurs simples et statiques
          • la balise <resources> est la racine du fichier XML
          • la structure de chaque fichier XML permet de définir les valeurs suivantes :
            • <string> : libellé
            • <plurals> : libellé qui varie en fonction d'un nombre
            • <string-array> : tableau de chaînes de caractères
            • <array> : tableau de valeurs
            • <color> : couleur exprimé en #RGB, #RRGGBB, #RGBA ou #RRGGBBAA, avec AA le niveau de transparence
            • <dimen> : dimension. Il faut spécifier l'unité (ex: px, in, pt, mm, dp, sp)
            • <style> : permet de définir un style (l'héritage est supporté)

        Interfaces utilisateur

        • res/layout : ce répertoire contient les fichiers XML définissant les interfaces utilisateurs

        Menus

        • res/menu : répertoire contenant les fichiers XML décrivant les menus et les entrées de ces menus

        Images

        • res/drawable-* : ce répertoire contient les images qui sont de préférence au format PNG
          • il existe plusieurs répertoires drawable selon la résolution de l'écran

        Animations

        • res/anim : animations : transparence, zoom, translation, rotation

        Internationalisation

        Nous pouvons définir des fichiers de ressources pour gérer la langue et les libellés.

        Le nom du répertoire contient le code de la langue.

        Exemple :
        • res
          • values : 
            • répertoire contenant les fichiers XML avec des valeurs et des libellés par défaut
          • values-fr : 
            • répertoire contenant les fichiers XML avec des valeurs et des libellés pour la langue française

        Référencer des ressources dans les fichiers XML de ressources

        Dans un fichier de ressource, nous pouvons une valeur contenu dans un autre fichier de ressource du projet via son nom.

        La syntaxe est la suivante :
        @type/nom
        exemple:
        @string/projectName
        @dimen/buttonSize
        @color/backgroundColor
        , avec :
        • type : le type de la ressource, à remplacer par :
          • string
          • array
          • dimen
          • color
          • style
        • nom : le nom de la ressource

        Exemple :

        <resources>
            <string name="firstname">First name</string>
        </resources>
        Dans le fichier XML de l'interface utilisateur, on référence le texte du libellé via l'expression suivante :
        <EditText android:text="@string/firstname" />

        Valeurs par défaut Android

        Android contient des valeurs par défaut qui peuvent être référencées via la syntaxe suivante :
        @android:type/nom

        Android contient par exemple des codes couleurs par défaut :
        • @android:color/white
        • @android:color/black
        • @android:color/blue
        • @android:color/red
        • etc.

        Accéder aux ressources en Java

        Classe R

        La classe R est générée automatiquement par l'IDE et contient le nom des éléments actuellement définis dans les fichiers de ressources.

        Ceci permet d'avoir l'auto-complétion dans le code Java par rapport à ce qui est définit dans les fichiers de ressources et également d'avoir des erreurs de compilation si une des ressources n'existe plus.

        Voici la structure de la classe R :

        • R.string : nom des libellés
        • R.layout : interfaces utilisateur
        • R.id : identifiants des éléments dans les interfaces utilisateurs
        • R.array : nom du tableau de valeurs
        • R.drawable : nom de l'image
        • R.color : nom de la couleur
        • R.dimen : nom de la dimension
        • R.anim : nom de l'animation

        Récupérer des valeurs

        Voici un exemple de code pour récupérer ces valeurs en Java :
        // Objet d'accès aux ressources
        Resources resources = getResources();
        
        // récupérer un libellé
        String label = resources.getText(R.string.code_label);
        
        // récupérer une ensemble de chaînes de caractères
        String[] stringArray = resources.getStringArray(R.array.string_array);
        
        // récupérer une liste de valeurs
        int[] intArray = resources.getIntArray(R.array.integer_array);
        

        Récupérer les éléments de la vue dans une activité

        Dans une activité :
        // définir l'interface utilisateur d'une activité
        setContentView(R.layout.main);
        
        // récupérer un champ texte de l'interface utilisateur
        TextView textView = (TextView) findViewById(R.id.text_id);