0

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); 
    } 
+0

Utilisez-vous .Appliquer() ou .commit() pour mettre à jour le pref partagé? –

+0

Je ne mets pas à jour les préférences, je ne fais que les lire. – intA

+1

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é. –

Répondre

0

getDefaultSharedPreferences() va obtenir le fichier par défaut préférences pour votre application. Si vous essayez d'écouter les changements dans un autre fichier (qui est, si vos préférences sont dans un fichier que vous vous named), vous devez utiliser getSharedPreferences(String nameOfFile, int mode)

getSharedPreferences in android docs