0

Je reçois une erreur de compilation ne peut pas résoudre la méthode findPreference lorsque j'essaie d'initialiser un écouteur OnSharedPreferencesChanged dans mon MainActivity. Selon la réponse here:Impossible de résoudre findPreference() à partir de MainActivity?

findPreference() doit être appelé à partir d'une classe qui implémente l'interface PreferenceActivity

mais je ne comprends pas ce que le code pour le faire serait. Comment puis-je me débarrasser de l'erreur du compilateur et définir avec succès les auditeurs pour les changements de préférence?

MainActivity.java

public class MainActivity extends FragmentActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 
     private SharedPreferences.OnSharedPreferenceChangeListener listener; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      ... 
      //Test preference menu 
      listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
       public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
        if (key.equals("pref_wood")) { 
         Preference woodPref = findPreference(key); //COMPILER ERROR HERE 
         MainActivity.getGLSurfaceView().setTexture(""); 
         // Set summary to be the user-description for the selected value 
         woodPref.setSummary(sharedPreferences.getString(key, "")); 
        } 
       } 
      } 
     } 
    } 

Répondre

5

findPreference est une méthode qui fait partie des deux PreferenceFragment et PreferenceActivity - ce sont les fragments/activités qui montrent effectivement l'écran de votre préférence (l'activité est dépréciée et vous devriez être en utilisant le PreferenceFragment). Vous essayez de l'utiliser dans votre MainActivity. Cela ne fonctionne pas parce que les objets de préférence n'existent pas réellement sur cet écran (ils existent dans une autre activité qui a généralement un PreferenceFragment en tant que partie). Si vous avez besoin d'avoir accès à une valeur de préférence d'une préférence dans une activité qui n'est pas l'écran de votre préférence, utilisez SharedPreferences, quelque chose comme:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 
int defaultValue = getResources().getBoolean(R.bool.saved_high_score_default); 
boolean wood = sharedPref.getBoolean(pref_wood, defaultValue); 

Vous pouvez consulter la documentation pour d'autres exemples.

Si votre MainActivity est censé être un écran affichant les paramètres, vous devez probablement le renommer et inclure un fragment de préférence à l'intérieur.

Je crois que vous allez aussi avoir des problèmes avec setSummary parce que le Preference ne fait pas partie de cette activité, cela fait partie de l'activité où vous modifiez réellement les préférences. setSummary est utilisé pour mettre à jour l'interface utilisateur réelle du Preference de sorte que si vous, par exemple, sélectionnez l'une des trois valeurs lors de l'utilisation d'une préférence de liste, il affiche la valeur que vous venez de sélectionner à l'écran.