Comme décrit ici , je sous-classe PreferenceFragment et je l'affiche dans une activité. Ce document explique comment écouter les changements de préférences ici , mais uniquement si vous sous-classez PreferenceActivity. Puisque je ne fais pas cela, comment écouter les changements de préférences?
J'ai essayé d'implémenter OnSharedPreferenceChangeListener dans mon PreferenceFragment mais cela ne semble pas fonctionner ( onSharedPreferenceChanged
ne semble jamais être appelé).
C'est mon code pour l'instant:
SettingsActivity.java
public class SettingsActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}
}
SettingsFragment.java
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener
{
public static final String KEY_PREF_EXERCISES = "pref_number_of_exercises";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
//IT NEVER GETS IN HERE!
if (key.equals(KEY_PREF_EXERCISES))
{
// Set summary to be the user-description for the selected value
Preference exercisesPref = findPreference(key);
exercisesPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference
android:defaultValue="15"
android:enabled="true"
android:key="pref_number_of_exercises"
android:numeric="integer"
android:title="Number of exercises" />
</PreferenceScreen>
De plus, le PreferenceFragment est-il le bon endroit pour écouter les changements de préférences ou dois-je le faire dans l'activité?
android
android-fragments
android-activity
sharedpreferences
android-preferences
XåpplI'-I0llwlg'I -
la source
la source
Réponses:
Je crois que vous avez juste besoin de vous inscrire / désinscrire
Listener
dans votrePreferenceFragment
et cela fonctionnera.Selon ce que vous voulez faire, vous n'aurez peut-être pas besoin d'utiliser un auditeur. Les modifications apportées aux préférences sont
SharedPreferences
automatiquement validées .la source
getPreferenceManager
(comme vous l'avez fait) ougetPreferenceScreen
? Quelle est la différence?getPreferenceManager
c'est généralement l'option préférée.key
devrait être le paramètre? N'a pas essayé cela, vous avez un exemple dans la réponse de Gunnar ci - dessous:onSharedPreferenceChanged(null, "")
. Cela peut ne pas convenir à vos besoins. Peut-être devriez-vous itérer sur vos clés de préférences qui nécessitent une mise à jourLa solution d'Antew fonctionne bien, ici vous pouvez voir une activité de préférence complète pour Android v11 et plus:
la source
Toutes les autres réponses sont correctes. Mais j'aime mieux cette alternative car vous avez immédiatement l'instance Preference qui a provoqué le changement.
la source
onSharedPreferenceChanged ()
vous puissiez accéder facilement à l'instance Preference avecfindPreference(key)
. Peut-être que laSharedPreferences
voie est préférée en raison de l'enregistrement / désinscription?Cela a fonctionné pour moi à partir de PreferenceFragment.onCreate ()
la source
Voici une façon de le faire et d'éviter toute fuite de mémoire potentielle:
la source
Un autre exemple complet pour que vous voyiez l'image entière.
la source
J'ai récemment fini de créer le mien en
PreferenceScreen
utilisant lePreferences API
, donc j'ai pensé que je contribuerais à mon propre exemple complet. Cela inclut la miseSummary
à jour de la valeur nouvelle / modifiée, ainsi que l'écoute et la réaction aux changements.PS. Pour répondre à votre dernière question: pour afficher une valeur par défaut pour
Summary
lors de la création initiale dePreferenceScreen
(avant toute modification de la valeur), vous pouvez simplement définir laandroid:summary
valeur de votre choix, à partir dupreferences.xml
fichier directement - puis, une fois là est un changement dans la valeur, il se mettra à jour automatiquement en utilisant le code contenu dans mon exemple ci-dessous. Personnellement , j'utilise une brève explication de laPreference
comme initialeSummary
, défini dans mypreferences.xml
, et une fois que la valeur estêtre changé pour la première fois, il affichera simplement la valeur actuelle comme àSummary
partir de là ..Quoi qu'il en soit , voici mon exemple complet :
SettingsFragment.java
J'espère que ça aide!
Tout retour positif est grandement apprécié, car je suis assez nouveau sur StackOverflow;)
Bon codage!
la source
onPause
, doit-ilsuper.onPause()
être appelé avant ou après que l'auditeur ne soit pas enregistré? Y a-t-il même une différence? J'ai vu les deux dans de nombreux exemplessuper.onPause();
est probablement la meilleure façon de procéder.Il vous suffit de supprimer la classe Prefernce spécifiée dans votre
onResume()
méthode. Dans mon cas, j'utilisais laSwitchPreference
classe, donc le code serait comme- SettingsActivity.classEnsuite, dans l'activité où vous souhaitez utiliser la
PrefernceFragment
valeur, utilisez simplement l'SharedPreference
objet pour appeler les valeurs et le déclencher.la source