Module de Programmation Android (LP PRISM AirFrance)
TD7 - Préférences d'une application
Les objectifs de ce TD sont :
- la mise en place d'un fragment de préférences, affiché lorsque
l'utilisateur clique sur le bouton correspondant du menu et enlevé
lorsqu'il clique sur le bouton de retour ;
- la réaction de l'application aux choix de préféences de
l'utilisateur ;
- le chargement des préférences au démarrage de l'application.
Pour cela, nous allons juste afficher du texte, dont le style sera
déterminé par les préférences.
Le début du TD (avant "Menu de préférences") sert à mettre en place
l'affichage du fragment de préférences, à l'aide de manipulations de
fragments comme vues au TD précédent. La suite du TD s'intéresse plus
particulièrement à ce que l'API Android offre pour gérer les
préférences.
Mise en place
- Commencer une nouvelle application, en choisissant comme la
dernière fois
Blank Activity with Fragment
, nommée par
exemple TD7Activity
.
- Modifier l'interface de manière à ce que l'activité n'utilise plus
le fragment, mais affiche un zone de texte contenant "Bonjour !" suivi
d'un FrameLayout (occupant tout le reste de l'écran) vide.
- Ne pas oublier si besoin de modifier
import android.support.v4.app.Fragment;
(dans TD7ActivityFragment.java
) en
import android.app.Fragment;
.
Ouverture et fermeture du menu de préférences
- Faire en sorte qu'un fragment de
type
TD7ActivityFragment
soit attaché lorsque
l'utilisateur clique sur le bouton Settings
du menu.
Une fois que l'utilisateur aura choisi ses préférences, il voudra
quitter le menu de préférences, c'est-à-dire dans notre cas détacher le
fragment de type TD7ActivityFragment
. Cela se fait
généralement en appuyant sur le bouton de retour d'Android.
- Tester : ouvrir les préférences, puis cliquer sur le bouton de
retour. Qu'observe-t-on ?
Android offre la possibilité de modifier l'action sur le bouton de
retour. Lorsque l'utilisateur appuie sur ce bouton, la
méthode void
onBackPressed()
de la
classe Activity
(que notre activité TD7Activity
surcharge) est appelée ; il
suffit donc de surcharger cette méthode pour modifier le comportement du
bouton de retour.
- Surcharger cette méthode pour que le fragment de préférences soit
détaché lorsque l'utilisateur clique sur le bouton. Tester.
- Faire attention à ce qui se passe lorsque l'utilisateur clique sur
le bouton de retour alors que les préférences ne sont pas ouvertes :
on peut soit ne rien faire, soit retrouver le comportement précédent,
mais il est inutile de chercher à détacher le fragment de
préférences.
Plutôt qu'utiliser une transaction pour détacher le fragment de
préférences, le gestionnaire de fragments mémorise les transactions dans
une structure de pile, ce qui permet de revenir facilement à l'état
précédent.
Menu de préférences
Nous allons maintenant faire de notre fragment en un fragment de
préférences.
- Faire que la classe
TD7ActivityFragment
hérite
de PreferenceFragment
(au lieu de
simplement Fragment
).
Interface de préférences
- Dans l'arborescence du projet, faire un clic droit
sur
app
puis aller dans
New/Android Resource File
. Choisir un nom (par
exemple, preferences
, qui est le nom donné usuellement)
et prendre XML
comme Resource type
.
- Associer cette interface au fragment :
- Supprimer la méthode
onCreateView
de la
classe TD7ActivityFragment
.
- Surcharger la méthode
onCreate
de la
classe TD7ActivityFragment
, de manière à ce qu'elle
lance l'affichage du fichier d'interface XML :
@Override
public void onCreate(Bundle savedInstanceState) {
// Appel de la méthode de la super-classe
super.onCreate(savedInstanceState);
// Chargement de l'interface XML
addPreferencesFromResource(R.xml.preferences);
}
- Ajouter à l'interface de préférences une case à cocher, en
insérant entre les deux balises d'ouverture et de
fermeture
PreferenceScreen
:
<CheckBoxPreference
android:key="text_size"
android:title="Texte en grand"
android:defaultValue="false"/>
android:key
contient une chaîne de caractères
qui est un identifiant unique de la préférence, servant à la
sauvegarder et à la distinguer des autres ;
android:title
est le sujet de la préférence, qui
sera affiché à l'utilisateur ;
android:defaultValue
est la valeur par défaut de
la préférence, la première fois que l'application est lancée
(ensuite, on utilise la valeur sauvegardée).
- Pour que les valeurs par défaut soient correctement appliquées
lors du premier lancement de l'application, ajouter à la fin de la
méthode
onCreate
de la
classe TD7Activity
:
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
- Tester. Cocher la case, puis fermer l'application. Relancer
l'application et vérifier que la case est bien restée cochée.
Réaction au changement d'une préférence
Lorsque l'utilisateur modifie une préférence, Android appelle la méthode
void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
de l'interface
SharedPreferences.OnSharedPreferenceChangeListener
. Il
suffit d'implanter cette méthode pour réaliser les actions que l'on
souhaite en fonction des préférences.
- Spécifier que la classe
TD7ActivityFragment
implante
l'interface
SharedPreferences.OnSharedPreferenceChangeListener
.
- Définir la méthode :
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("text_size")) {
// Récupération de la préférence associée à la clé
CheckBoxPreference pref = (CheckBoxPreference) findPreference(key);
// Action à effectuer
}
}
- Compléter la méthode pour quelle change la taille du texte
"Bonjour !" en fonction de la préférence. On pourra utiliser la
méthode
boolean isChecked()
de la
classe CheckBoxPreference
.
- Lancer l'écouteur (
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
) et l'arrêter (getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
) dans les
méthodes onResume
et onPause
réciroquement
(ne pas oublier d'appeler la méthode de la super-classe). Tester.
- Cocher la case, puis quitter l'application et la relancer.
Qu'observe-t-on ?
Chargement des préférences au démarrage d'une application
Ce qu'on vient de faire ne déclenche une action que lorsque
l'utilisateur modifie les préférences. Au lancement de l'application,
il faut lire les préférences (qui sont déjà sauvegardées) afin de la
lancer selon le souhait de l'utilisateur.
La méthode SharedPreferences getDefaultSharedPreferences (Context context)
de la
classe PreferenceManager
permet de récupérer l'ensemble des
préférences, que l'on peut ensuite inspecter pour récupérer des valeurs.
Par exemple, dans notre cas, on peut savoir si la case est cochée
ainsi :
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
boolean b = sharedPref.getBoolean("text_size", false);
- Faire en sorte que les préférences soient appliquées au démarrage
de l'application. Tester.
À vous de jouer
- Ajouter dans les préférences un bouton curseur de
type
SwitchPreference
.
- Faire en sorte que ce bouton contrôle la couleur du texte
"Bonjour !" (avec les couleurs de votre choix). On pourra utiliser
pour cela la méthode
de la
classe
, prenant en argument un entier
étant la représentation "ARGB" ("Alpha" (transparence), "Red",
"Green", "Blue") de la couleur (par exemple, la couleur noire est
représentée par 0xFF000000
, et la couleur rouge
par 0xFFFF0000
.).
- Ajouter dans le menu de l'activité un bouton qui restaure les
paramètres par défaut. Ne pas hésiter à aller chercher dans la
documentation...
Pour aller plus loin
Retirer la zone de texte contenant "Bonjour !" de l'interface de
l'activité, et en faire le contenu d'une interface d'un nouveau
fragment, attaché au démarrage de l'application. Faire en sorte que
cliquer sur le bouton "Settings" remplace ce fragment par le fragment de
préférences, et réciproquement en cliquant sur le bouton de retour.
- Faire en sorte que les préférences s'appliquent à l'objet de ce
nouveau fragment. On aura pour cela besoin de faire communiquer deux
fragments d'une même activité entre eux : on pourra s'inspirer de
ce tutoriel.
Retour à la page du cours |