68 votes

onSharedPreferenceChanged n'est pas déclenché si un changement survient dans une activité distincte?

J'ai implémenté onSharedPreferenceChanged de mon activité principale.

Si je modifie les préférences de l'activité principale, mon événement se déclenche.

Si je modifie les préférences à travers mon écran des préférences (PreferenceActivity) que mon cas ne se déclenche PAS lorsque les préférences sont modifiés (parce que c'est une activité distincte et séparée de référence pour sharedPreferences?)

Quelqu'un at-il une recommandation de la façon dont je devrais aller sur surmonter cette situation?

Merci!

EDIT1: j'ai essayé d'ajouter le gestionnaire d'événement dans mon activité de préférence, mais il n'est jamais déclenché. La méthode suivante est appelée lors de onCreate de mon activité de préférence. Quand j'ai changer les valeurs, il n'a jamais imprime le message (msg() est un wrapper pour Log.d).

private void registerChangeListener () {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

    sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener () {
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            msg (" ***** Shared Preference Update ***** ");
            Intent i = new Intent();
            i.putExtra("KEY", key);
            i.setAction("com.gtosoft.dash.settingschanged");

            sendBroadcast(i);

            // TODO: fire off the event
        }
    });
}

136voto

thumbmunkeys Points 11757

L' OnSharedPreferenceChangeListener obtient des ordures collectées dans votre cas, si vous utilisez une classe anonyme.

Pour résoudre ce problème, utilisez le code suivant en PreferenceActivity pour s'inscrire et annuler l'inscription d'un changement de port d'écoute:

public class MyActivity extends PreferenceActivity implements
    OnSharedPreferenceChangeListener {

@Override
protected void onResume() {
    super.onResume();
    // Set up a listener whenever a key changes
    getPreferenceScreen().getSharedPreferences()
            .registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();
    // Unregister the listener whenever a key changes
    getPreferenceScreen().getSharedPreferences()
            .unregisterOnSharedPreferenceChangeListener(this);
}

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) 
{
  // do stuff
}

voir aussi SharedPreferences.onSharedPreferenceChangeListener pas être appelée de façon constante

14voto

hderanga Points 548

Cela se produit parce que garbage collector. cela ne fonctionne qu'une fois. alors la référence est collectée comme une poubelle. alors créez un champ d'instance pour le programme d'écoute.

 private OnSharedPreferenceChangeListener listner;

listner = new SharedPreferences.OnSharedPreferenceChangeListener() {        
        @Override
        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
            //implementation goes here
        }
    };
    prefs.registerOnSharedPreferenceChangeListener(listner);
 

7voto

mrArias Points 1

Je suis arrivé ici, comme beaucoup d'autres, parce que mon auditeur ne sera pas déclenché quand j'ai changé mon boolean à partir d' true de false, ou vice-versa.

Après beaucoup de lecture, et de refactoring, de commutation contexts/inner classes/privates/static/ et le genre, j'ai réalisé que mon (stupide) erreur:

L' onSharedPreferenceChanged est seulement appelé si quelque chose change. Seulement. Jamais.

Au cours de mes tests, j'ai été tellement stupide de cliquer sur le même bouton tout le temps, donc l'attribution de la même valeur booléenne de la préférence de tous les temps, il n'a jamais changer.

Espérons que cela aide quelqu'un!!

0voto

Cristian Points 92147

Pourquoi n'ajoutez-vous pas simplement onSharedPreferenceChanged dans le reste des activités où les préférences pourraient changer?

-2voto

shridutt kothari Points 2038

Réponse finale: lors de la lecture de données lisibles en Word partagées par la première application, nous devrions

Remplacer

 getSharedPreferences("PREF_NAME", Context.MODE_PRIVATE);
 

avec

 getSharedPreferences("PREF_NAME", Context.MODE_MULTI_PROCESS);
 

dans la deuxième application pour obtenir la valeur mise à jour dans la deuxième application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X