Aller au contenu

Gestion des préférences


Hervéé

Recommended Posts

Bonjour,

J'ai du mal à comprendre comment fonctionne les préférences. J'ai lu http://wiki.frandroid.com/wiki/Int%C3%A9grer_un_syst%C3%A8me_de_pr%C3%A9f%C3%A9rence_%C3%A0_une_application et je l'ai fait et ça marche bien (graaand merci à l'auteur), mais je ne comprends pas plusieurs choses :

- comment sait-on qu'un utilisateur a modifié une préférence ?

- y a-t-il un moyen d'écouter avec un listener depuis un service une modif dans ces préférences ?

- comment une appli "sait" quelles sont ses préférences, ou est-ce que ça ne marche que par Activity ?

- comment gère-t-on les préférences pour savoir si elles ont déjà été enregistrées ?

Mes questions sont sans doute brouillon, mais c'est parce que j'ai du mal à comprendre le contexte, désolé.

Merci pour votre aide.

Lien vers le commentaire
Partager sur d’autres sites

- comment sait-on qu'un utilisateur a modifié une préférence ?

On peut enregistrer un listener sur les préférences, pour être notifié de la modification des préférences registerOnSharedPreferenceChangeListener

- y a-t-il un moyen d'écouter avec un listener depuis un service une modif dans ces préférences ?

oui, cf réponse ci-dessus

- comment une appli "sait" quelles sont ses préférences, ou est-ce que ça ne marche que par Activity ?

Preferences.getDefaultSharedPreferences permet de récupérer les préférences de l'application. Après, tu peux en faire ce que tu veux

- comment gère-t-on les préférences pour savoir si elles ont déjà été enregistrées

tu peux tester la présence d'une préférence (méthode contains); ou utiliser le paramètre valeur par défaut, lors de la récupération de la valeur d'une préférence pour gérer le cas des préférences non encore saisies...

Lien vers le commentaire
Partager sur d’autres sites

Preferences.getDefaultSharedPreferences permet de récupérer les préférences de l'application. Après, tu peux en faire ce que tu veux

tu peux tester la présence d'une préférence (méthode contains); ou utiliser le paramètre valeur par défaut, lors de la récupération de la valeur d'une préférence pour gérer le cas des préférences non encore saisies...

Mais au premier lancement de l'appli, ces préférences sont-elles vides, ou y a-t-il un truc magique qui définisse un contenu par défaut ?

Merci pour l'info sur les listeners. Ça veut dire que, lorsqu'on présente le PreferenceActivity, il contient autant de listener UI qu'il y a de préférence ? Alors ce listener UI enregistre la préférence modifiée, et tous les listeners sur cette preference sont alors alertés. Est-ce comme ça qu'il faut faire ?

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Oui, au premier lancement, les préférences sont vides. Et au deuxième aussi, éventuellement. Tant que tu n'as pas stocké explicitement une info dans tes préférences, celles-ci sont vides. Et tu peux y stocker une valeur soit de manière interactive, via le PreferenceActivity, soit par programmation (en utlisant un SharedPreference.Editor)

Les listeners sur une préférence sont notifiés des modifications apportées sur cette préférence, qu'elles soient faites de manières interactives ou par programmation

Lien vers le commentaire
Partager sur d’autres sites

Alors les preferences du PreferenceActivity se gèrent toutes seules, c'est à dire que android les sauvegardes lors d'une manip utilisateur ?... Mais comment android sait-il qu'il s'agit des préférences applicatives ?

Lien vers le commentaire
Partager sur d’autres sites

Oui, les préférences du PreferenceActivity sont automatiquement gérées par Android. Et tu peux les récupérer, par programmation, par un appel à Preferences.getDefaultSharedPreferences

C'est plutôt PreferenceManager.getDefaultSharedPreferences, non ? (mais l'url est ok) ;)

Cela marche, mais je ne comprends pas pourquoi :mad:

Android semble même capable de trouver les préférences telles que je les aie définies par défaut, même si je n'ai jamais affiché de PreferenceActivity. Comment fait-il ? C'est parce qu'il considère que toute définition de <PreferenceScreen> est une liste de préférences applicative ?

Lien vers le commentaire
Partager sur d’autres sites

C'est plutôt PreferenceManager.getDefaultSharedPreferences, non ? (mais l'url est ok)

Oups, pardon, oui, c'est bien PreferenceManager :)

Cela marche, mais je ne comprends pas pourquoi

Je ne comprends pas ce que tu ne comprends pas...

Quelles valeurs par défaut Android trouve-t'il ? Celles que tu indiques en paramètre lors des appels à getBoolean/getString/... de SharedPreferences ?? Normal, non ? ;)

Sauf erreur de ma part, on n'indique pas de valeur par défaut dans le PreferenceScreen; on n'y définit pas un contenu, mais plutôt un écran; en ce sens, dans le concept, c'est assez proche de ce qu'est un Layout

Lien vers le commentaire
Partager sur d’autres sites

Je ne comprends pas que je ne comprenne pas que tu ne me comprennes pas B)

Malheureusement je ne sais pas retourner avec Eclipse et / ou adb à "pas de preference du tout".

Du coup je ne suis sûr de rien au sujet de "la première fois". Ce qu'il y a de sûr, c'est que les préférences définies dans un PreferenceScreen persistent (ce qui est bien), alors même qu'il n'y a rien dans mon code qui le fasse, et que je ne vois pas du tout comment, à partir d'un getDefaultSharedPreferences, android sait faire le rapport avec un PreferenceScreen ?

Voici mon preferencescreen, dans le fichier res/xml/preference.xml :

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:title="Préférences">
 <CheckBoxPreference 
 android:key="notifications"
 android:title="Notifications"
 android:summaryOn="Vous recevez les notifications"
 android:summaryOff="Vous ne recevez pas les notifiactions"
 android:defaultValue="true"/>
</PreferenceScreen>

Mon activity de preference c'est:

public class MaPreferenceActivity extends android.preference.PreferenceActivity 
{
@Override
protected void onCreate(Bundle savedInstanceState) 
{
	super.onCreate(savedInstanceState);
	addPreferencesFromResource(R.xml.preference);
}
}

... et je lance le MaPreferenceActivity avec startActivity(new Intent(this, MaPreferenceActivity.class)) par ailleurs.

Et dans l'activity principale, pour afficher les préférences, je fais juste :

Log.i(getClass().getName(), "pref:"+PreferenceManager.getDefaultSharedPreferences(this).getAll());		

Et avec ça, android me logue bien la bonne valeur de la préférence "notifications". Comment fait-il ? Comment sait-il que R.xml.preference est la préférence par défaut, alors que, comme tu dis, ce n'est qu'une définition de GUI ? Que se passe-t-il, s'il y a plusieurs PreferenceScreen dans une appli ?

Lien vers le commentaire
Partager sur d’autres sites

A priori, les SharedPreferences sont stockées dans un(des ?) fichier(s) XML, dans le répertoire shared_prefs présent dans le répertoire de ton application, dans la mémoire interne de ton téléphone (accessible uniquement, en adb, que si tu es root sur ton téléphone)

Et ne sont stockées dans ce fichier que les préférences qui ont été modifiées/saisies explicitement. D'ailleurs, le répertoire shared_prefs n'existent pas tant que tu n'as pas stocké une préférence, même si tu as une PreferenceActivity que tu n'as jamais affiché

Et Android fait le lien entre la PreferenceScreen et le getDefaultSharedPreferences, parce que PreferenceActivity doit s'appuyer sur getDefaultSharedPreferences pour savoir où stocker les valeurs des préférences

Et si tu définis plusieurs PreferenceScreen, leurs données seront stockées au même endroit. Il n'y aura pas de conflit tant que les identifiants de tes préférences (android:key dans le XML) sont différentes les unes des autres

Lien vers le commentaire
Partager sur d’autres sites

Merci pour toutes ces infos, qui sont très intéressantes.

Et est-ce que tu sais comment on reset complètement les préférences (c'est à dire qu'elles n'existent plus, pas même qu'elle soit à défaut), tant sur un téléphone que sur l'émulateur. ?

Je ne me sers que de l'émulateur, pour l'instant, et je ne vois pas de répertoire shared_prefs ? Si je fais un grep pour chercher où diable il a pu mettre mon "notifications", il ne trouve que des fichiers binaires :

~/.android/ ls **/shared_prefs
zsh: no matches found: **/shared_prefs
~/.android/ grep notifications **/*
Fichier binaire avd/Andro2.1.avd/userdata.img concordant
Fichier binaire avd/Andro2.1.avd/userdata-qemu.img concordant
Fichier binaire avd/debuter.avd/userdata.img concordant
Fichier binaire avd/debuter.avd/userdata-qemu.img concordant

Lien vers le commentaire
Partager sur d’autres sites

Faut que tu te connectes sur ton téléphone/émulateur, pour y accéder

adb shell
cd /data/data/<nom de package de ton appli>
ls

Tu devrais y trouver ce répertoire shared_prefs

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...