juil
20
2010

[Tutoriel Android] Partie 5 – Les écrans de préférences

Une petite préférence ?

Aujourd’hui, nous allons nous attaquer au système de préférences sur la plateforme mobile Android.

Android dispose d’une classe nommée PreferenceActivity, héritant de la classe Activity permettant de créer des écrans de préférences facilement et intuitivement.

A la fin de notre tutorie,l nous arriverons à un écran de préférence de ce type :

Ecran final

Comme à chaque tutoriel, je vais faire en sorte d’utiliser les précédents pour vous permettre de comprendre plus facilement les diverses utilisations que l’on peut avoir de chacun d’entre eux.

Nous allons tout d’abord générer un tout nouveau projet et y ajouter un menu (vous savez quand on clique sur le bouton menu :lol: ).

Ce menu contiendra un seul bouton “Options” :

Le fichier xml se nommera menuprincipal.xml et il sera composé comme ceci :

<?xml version="1.0" encoding="utf-8"?>

<menu

xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/itemOptions" android:title="Options"></item>

</menu>

Puis, dans la classe MonActivite.java, nous allons afficher ce menu et gérer le cliquer sur le bouton :

private static int CODE_RETOUR = 1;

@Override

public boolean onCreateOptionsMenu(Menu menu) {

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

return super.onCreateOptionsMenu(menu);

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

if(item.getItemId() == R.id.itemOptions) {

startActivityForResult(new Intent(this, MesPreferences.class), CODE_RETOUR);

}

return super.onOptionsItemSelected(item);

}

Comme dans le tutoriel précédent, on utilise le MenuInflater pour que le menu utilisé soit le fichier XML et on vérifie le clic sur le bouton “Options“.

Jusqu’ici rien de bien difficile, nous allons modifier le layout principal pour lui ajouter quelques TextView.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<TextView

android:id="@+id/tvLogin"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

<TextView

android:id="@+id/tvPassword"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

<TextView

android:id="@+id/tvRingtone"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

<TextView

android:id="@+id/tvVibrate"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

</LinearLayout>

Maintenant, nous allons travailler sur les préférences. Créons une nouvelle classe nommée MesPreferences héritant de la classe PreferenceActivity.

Ajoutons l’Override de la métode onCreate (CTRL + ESPACE  sous Eclipse pour aller plus vite).

Rajoutons un fichier XML pour les préférences comme ceci :

Ajout des préférences

Maintenant dans le fichier XML, nous allons rajouter les diverses informations comme ci-dessous :

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen

xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory android:title="Utilisateur">

<EditTextPreference

android:key="login"

android:title="Nom d'utilisateur"

android:summary="Entrez votre nom d'utilisateur">

</EditTextPreference>

<EditTextPreference

android:title="Mot de passe"

android:key="password"

android:summary="Entrez votre mot de passe"

android:password="true">

</EditTextPreference>

</PreferenceCategory>

<PreferenceCategory android:title="Notifications">

<RingtonePreference

android:key="sonnerie"

android:title="Sonnerie de notification"

android:summary="Choisissez la sonnerie pour les notifications">

</RingtonePreference>

<CheckBoxPreference

android:key="vibrate"

android:title="Vibreur"

android:summary="Vibre lors d'une notification">

</CheckBoxPreference>

</PreferenceCategory>

</PreferenceScreen>

On remarquera les PreferenceCategory, qui seront des conteneurs comme le LinearLayout mais avec un titre.

Puis les EditTextPreference contenant les attributs suivants :

android:key : Qui sera utilisé comme un id pour récupérer les préférences

android:title : Titre de la préférence à afficher

android:summary : Descriptif de la préférence

android:password : Définie si le champ sera un mot de passe

Les RingtonePreference permette de choisir une sonnerie installée sur le téléphone.

Les CheckBoxPreference sont comme leur nom l’indique une case à cocher.

Dans le fichier MesPreferences.java et dans la méthode onCreate que l’on a Override, nous allons charger notre fichier XML :

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);

}

La méthode addPreferencesFromResource prend en paramètre un fichier xml contenant les préférences.

Rendez-vous dans l’AndroidManisfest.xml et rajouter notre Activité dans l’onglet Application.

Lancez l’application et voyez par vous-même que lorsqu’on clique sur le bouton “Options“, la fenêtre d’activité s’ouvre et nous pouvons gérer nos informations.

Maintenant retournons dans notre activité principale et rajoutons une méthode nommée getPreferences() :

private void getPreferences() {

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

((TextView)findViewById(R.id.tvLogin)).setText("Nom d'utilisateur : " + preferences.getString("login", ""));

((TextView)findViewById(R.id.tvPassword)).setText("Mot de passe : " + preferences.getString("password", ""));

((TextView)findViewById(R.id.tvRingtone)).setText("Sonnerie : " + preferences.getString("sonnerie", ""));

((TextView)findViewById(R.id.tvVibrate)).setText("Vibreur : " + preferences.getBoolean("vibrate", false));

}

Pour récupérer les préférences, nous allons utiliser le PreferenceManager avec sa méthode statique getDefaultSharedPreferences prenant en paramètre notre contexte.

Cette méthode retourne un objet de type SharedPreferences stockant nos informations.

L’objet preferences contient diverses méthodes de type getString,getBoolean,getFloat,etc…, retournant l’information selon sa clef “android:key” et prend en second paramètre une valeur par défaut.

Je vous renvoie à la documentation pour plus d’information sur cette classe :

http://developer.android.com/reference/android/content/SharedPreferences.html

Maintenant, rajoutons un Override sur la méthode onActivityResult pour nous permettre de rafraichir nos données lorsque l’utilisateur valide l’écran de préférences.

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(requestCode == CODE_RETOUR) {

Toast.makeText(this, "Modifications terminées", Toast.LENGTH_SHORT).show();

getPreferences();

}

super.onActivityResult(requestCode, resultCode, data);

}

On vérifie tout d’abord notre code de retour, puis on affiche un message pour l’utilisateur et on rafraichit l’interface utilisateur.

Lançons l’application et comme par magie quand on modifie nos informations, on les voit s’afficher !

Activité finale

Vous savez désormais créer un écran de préférences, nous verrons dans le prochain tutoriel la création de liste de données.

Bonne soirée à vous tous et à la prochaine !

Sources :

FormationPreferences

Download PDF
  • http://SiteWeb Djipe

    Tous ces tutos sont magnifiques. Bravo pour ton travail.
    Pour le moment, mon emploie du temps ne me permet pas de les tester.
    Mais ton approche me plait beaucoup. Dès que je teste, j’te fais un retour sur mes remarques.

    Bonne continuation :smile:

  • Pierre-Emmanuel Mercier

    Merci a toi ca m’encourage a continuer.

  • http://SiteWeb Anubis

    Bonjour,

    Je viens de dévorer tes 5 premiers tutos, très instructifs! :wub:

    Je n’ai pas encore le temps de tester tes exemples, mais je vais peut être pouvoir utiliser directement ces notions pour l’application que je développe!

    Encore merci et surtout: CONTINUE!

    Bon courage,

    Anubis

  • http://SiteWeb kaloskagatos

    Merci !

  • http://SiteWeb Geff

    Bravo pour tes tutos !

    Plus je les lis et plus je code, plus j’ai envie de programmer pour android !

    bonne continuation à toi ! :wink:

  • http://www.tombek.fr/ Tombek

    Encore merci pour tous tes tutos !

    J’aurai une petite question, est-il possible de récupérer directement la valeur d’un item de préférence dans le onCreate de l’appli? parce que pour l’instant, si l’appli est fermé et qu’on réouvre l’appli, les préférences ne sont pas prisent en compte :)

    Merci d’avance pour la réponse

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    Normalement les écrans de préférences s’auto-sauvegarde dans le système, même quand tu redémarres l’application tes paramètres sont de nouveaux présents.

    Tu as du rater quelque chose d’important :)

  • http://SiteWeb Obli

    Non, Tombek a raison, du moment que “getPreferences()” n’est appellée que lorsque l’on revient de l’écran des préférences, l’interface n’utilise les valeurs sauvegardées qu’à ce moment là.

    Il faut aussi rajouter “getPreferences()” dans le “onCreate()” ;-)

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    En effet je n’avais pas fait attention ;)

  • http://SiteWeb Tomny

    Merci beaucoup pour vos tutos qui m’aident beaucoup dans mon projet actuel :)
    Je viens de mettre celui ci en application très facilement :p
    Mais je me heurte à un souci suite à cette mise en place.

    Vous utilisez getPreferences pour mettre à jour votre écran, moi je peux appeler et mettre à jour certains paramètres depuis n’importe quel activity de l’écran sachant que cette dernière peut afficher une des informations de préférences. Du coup je dois pouvoir recharger n’importe quelle activity après avoir fait appel aux préférences pour la remettre à jour et c’est la que je bloque. aucune idée de comment faire :blink:

    Si vous aviez une idée :wink:

    encore merci pour tout :biggrin:

  • http://SiteWeb raphael

    Bonjour, merci pour ce très bon tuto.
    J’aimerai savoir s’il est possible de modifier l’apparence de l’écran des préférence en changeant par exemple le fond ou autre chose chose.
    Merci d’avance

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    Regarde au niveau des styles Android c’est dans la doc officielle ça devrait t’aider :)

  • http://SiteWeb aliogan

    Comme l’ont déja dis la plupart, merci beaucoup pour tes tutos.
    Ils créent une bonne base pour débuter dans le développement android.

  • http://nessccorp.fr/ BapNesS

    Bonjour,

    Très bon tuto, merci. Cependant, même si j’arrive à modifier les layouts, les dividers reste ceux par défaut. Y a-t-il un moyen des les changer ?

    Merci.

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    Les dividers ?

  • Akiat

    Bonjour,

    Tout d’abord merci pour ces très bon tutos !

    Cependant je suis confronté à un problème: Eclipse ne reconnait pas la méthode addPreferencesFromResource(int) …

    Le message est le suivant:

    The method addPreferencesFromResource(int) is undefined for the type MyPreferences.

    Mon code est le suivant:


    public class MyPreferences extends PrefActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.mypreferences);
    }
    }

    Et j’ai bien mon fichier xml dans res/xml/mypreferences.xml.

    Je ne comprends vraiment pas… L’auto-complétion sur cette méthode ne marchait pas non plus…

    Si quelqu’un peu m’aider sa serai super :-)

    Merci par avance !

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    Bonsoir,

    Peut être un soucis d’héritage ? PreferenceActivity au lieu de PrefActivity

  • Akiat

    Je m’excuse car j’ai été vraiment mauvais sur ce coup la :p

    Merci pour ta réponse, et encore merci pour tous ces tutos !

  • http://naeh.net naeh

    et bien pas grand chose à dire, à part un grand merci :)

Switch to mobile version