Android : Les menus de préférences

22 novembre 2012 rdorigny 0 commentaires

Les applications ont besoins de proposer à l'utilisateur des menus de configuration ou des choix de fonctionnement ou paramètres.

Android dispose d'une méthodologie pour faire cela très simplement sans avoir à tout repenser : les menus de préférences. Ils fonctionnent à base de SharedPreference et ont été simplifiés au maximum. Tout est dans les fichiers xml qui décrivent la structure de nos préférences.



1)Introduction


La méthodologie est toujours la même:

  • 1)Créez un fichier sous res/xml/preferences.xml qui décrit la structure de notre menu de préférence,
  • 2)Faire hériter la classe avec PreferenceActivity,
  • 3)Charger le fichier xml,
  • 4)Récupérer les valeurs avec la méthodes getDefaultSharedPreferences()

  • A noter qu'il existe plusieurs méthodes pour charger le fichier xml, la plus simple étant par addPreferencesFromResource(). Nous allons faire exemple pour bien comprendre comment coder facilement un menu de préférences.



    package fr.doritique.menupref; import android.os.Bundle; import android.preference.PreferenceActivity; public class MainActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } }

    Le fichier preference.xml:
    <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="cb" android:title="Case à cocher" android:summaryOn="Case cochée" android:summaryOff="Case décochée" /> <EditTextPreference android:key="et" android:title="Editeur de texte" android:dialogTitle="Saisir un texte" android:dependency="cb" /> </PreferenceScreen>

    Ce qui donne:

    Ce qui est intéressant à noter, c'est la simplicité de mise en oeuvre, mais aussi le mode de stockage. Comme nous le disions initialement, les valeurs sont stockées sous forme de PreferenceShared, donc sous forme d'un fichier xml (dans notre exemple sous /data/app/data/fr.doritique/fr.doritique.menupref_preference.xml).


    Le fichier xml sera de la forme:
    <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="et">mon test </string> <boolean name="cb" value="true" /> </map>

    2)Les différentes structures

    2.1)La liste

    La structure ListPreference permet d'afficher une liste de choix prédéfinis. Les attributs :
  • dialogTitle: affiche le titre de la liste,
  • entries:précise les éléments à afficher,
  • entryValues:précise les valeurs qui seront stockés.

  • Le mieux est de proposer un exemple:
    <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <ListPreference android:key="pays" android:title="Choisir un pays" android:summary="Merci de choisir un pays" android:dialogTitle="Choisir un pays" android:entries="@array/liste_pays" android:entryValues="@array/liste_pays_preferences" /> <CheckBoxPreference android:key="cb" android:title="Case à cocher" android:summaryOn="Case cochée" android:summaryOff="Case décochée" /> <EditTextPreference android:key="et" android:title="Editeur de texte" android:dialogTitle="Saisir un texte" android:dependency="cb" /> </PreferenceScreen>

    Le fichier /res/values/array.xml :
    <?xml version="1.0" encoding="utf-8"?> <resources> <array name="liste_pays"> <item>Angleterre</item> <item>France</item> <item>Allemagne</item> </array> <array name="liste_pays_preferences"> <item>United kingdom</item> <item>France</item> <item>German</item> </array> </resources>

    Le fichier des Shared preference:
    <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="et">mon test </string> <string name="pays">German</string> <boolean name="cb" value="true" /> </map>

    2.2)La case à cocher

    Nous avons dans l'exemple initiale une case à cocher. L’attribut summaryOn indique la case est cochée, alors que summaryOff indique le contraire. A noter, l'attribut dependency qui indique une clé de la dépendance associée. Ainsi, la case est activée, alors la dépendance sera active également.

    2.3)La zone texte

    Voir également, l'exemple initiale.

    2.4)Sélection d'une sonnerie

    Il existe une structure spécifique pour sélectionner une sonnerie.
    <RingtonePreference android:key="sons" android:showDefault="true" android:title="choisir une sonnerie" android:showSilent="true" />

    3)Structurer les menus de préférences

    Souvent les menus de préférences deviennent des usines à gaz difficile à comprendre pour l'usager. Il est donc utile de les segmenter pour les simplifier.

    3.1)Les catégories

    La catégorie permet de rassembler des structures de préférences. Ainsi la vue affichée sera séparée par un séparateur ajouté par le framework automatiquement.

    Donc avec:
    <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory > <ListPreference android:key="pays" android:title="Choisir un pays" android:summary="Merci de choisir un pays" android:dialogTitle="Choisir un pays" android:entries="@array/liste_pays" android:entryValues="@array/liste_pays_preferences" /> </PreferenceCategory> <PreferenceCategory> <CheckBoxPreference android:key="cb" android:title="Case à cocher" android:summaryOn="Case cochée" android:summaryOff="Case décochée" /> <EditTextPreference android:key="et" android:title="Editeur de texte" android:dialogTitle="Saisir un texte" android:dependency="cb" /> </PreferenceCategory> </PreferenceScreen>

    On obtient:

    L'attribut title dans le PreferenceCategory permet rajouter un texte sur le séparateur pour favoriser la compréhension du thème de la catégorie qui suivra.

    3.2)La hiérarchisation des préférences

    Il est possible de hiérarchiser également les écrans en imbriquant les PreferenceScreen les uns dans les autres. Si on clique sur la zone, une activité est lancée est une vue associée apparaît.

    Par exemple:
    <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Pays"> <ListPreference android:key="pays" android:title="Choisir un pays" android:summary="Merci de choisir un pays" android:dialogTitle="Choisir un pays" android:entries="@array/liste_pays" android:entryValues="@array/liste_pays_preferences"/> <PreferenceScreen android:title="Faire un choix"> <CheckBoxPreference android:key="cb" android:title="Case à cocher" android:summaryOn="Case cochée" android:summaryOff="Case décochée"/> <EditTextPreference android:key="et" android:title="Editeur de texte" android:dialogTitle="Saisir un texte" android:dependency="cb"/> </PreferenceScreen> </PreferenceScreen>


    Ce qui donnera les deux vues ci-dessous:

    Conclusion

    Les menus de préférences sont très simples à mettre en oeuvre, et disposent d'une méthodologie pour réaliser leurs hiérarchisation. Ils sont conservés sous forme d'une map PreferedShared, ce qui permet de conserver et lire facilement les choix de l'usager








    Pseudonyme (obligatoire) :
    Adresse mail (obligatoire) :
    Site web :




    © 2017 www.doritique.fr par Robert DORIGNY