J'ai une application qui utilise les SharedPreferences d'Android. J'utilise un OnSharedPreferenceChangeListener pour effectuer une action lorsque ma ListPreference est modifiée. J'initialise mon OnSharedPreferenceChangeListener dans la méthode onStart()
de mon MainActivity et l'enregistre. Je l'ai désinscrit au onStop()
. Pour une raison quelconque, cela ne fonctionne pas du tout. Si je l'enregistre dans le onCreate()
de l'activité et ne jamais se désinscrire il semble que cela fonctionne bien. Pourquoi est-ce? Cela se produit même lorsque je lance l'activité pour la première fois et que j'essaie de changer les préférences. Par conséquent, onStop()
ne se fait jamais appeler et l'auditeur ne se désinscrit jamais. Le code correspondant est ci-dessous:OnSharedPreferenceChangeListener ne fonctionne pas comme prévu
private SharedPreferences.OnSharedPreferenceChangeListener prefListener;
private SharedPreferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scoring);
// Initialize our game rules preference to its default value
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
setupViews(GameEngine.BAGS_PER_ROUND);
startNewGame();
}
@Override
protected void onStart() {
super.onStart();
prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("game_mode_list")) {
startNewGame();
Log.d(TAG, "ListPreference clicked");
}
}
};
prefs.registerOnSharedPreferenceChangeListener(prefListener);
}
@Override
protected void onStop() {
super.onStop();
// Unregister changeListener to prevent leaks (although Android uses a weak reference)
prefs.unregisterOnSharedPreferenceChangeListener(prefListener);
}
Utilisez-vous .Appliquer() ou .commit() pour mettre à jour le pref partagé? –
Je ne mets pas à jour les préférences, je ne fais que les lire. – intA
OnSharedPreferenceChanged ne sera déclenché que lorsque vous modifiez la prérédence partagée dans laquelle vous avez enregistré l'écouteur. Donc, je suppose que dans un endroit vous obtenez un éditeur, que d'utiliser un .commit() ou un .apply() pour mettre à jour le fichier pref partagé. –