Wie kann man feststellen, ob Änderungen an den Einstellungen vorgenommen wurden?

76

Ich habe eine Klasse, die PreferenceActivity erweitert und den Einstellungsbildschirm meiner App anzeigt. Ist es möglich zu überprüfen, ob Änderungen an den Einstellungen vorgenommen wurden?

Das hilft...

http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html

Anderer verwandter Beitrag: SharedPreferences.onSharedPreferenceChangeListener wird nicht konsistent aufgerufen


public class PreferenceClass extends PreferenceActivity {

    OnSharedPreferenceChangeListener listener;

    public void onCreate(Bundle savedInstanceState) {
        SharedPreferences prefs = this.getSharedPreferences("settings", 0);
        listener = new SharedPreferences.OnSharedPreferenceChangeListener() {

            public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                int flag = 1;
            }
        };
        prefs.registerOnSharedPreferenceChangeListener(listener);
        super.onCreate(null);
        addPreferencesFromResource(R.xml.settings);
    }
}
mixkat
quelle
Ich sehe zu viele Richtungen, in die dies möglicherweise gehen könnte, abhängig von Ihrem Gesamtziel. Könnten Sie einige Einzelheiten darüber herausgeben, wann und zu welchem ​​Zweck Sie prüfen?
R Hughes
@RHughes Ich möchte nur jedes Mal, wenn eine Änderung vorgenommen wird, um etwas zu tun ... Ich habe gerade diesen Link gefunden stackoverflow.com/questions/2542938/… ... Ich kann es trotzdem nicht zum Laufen bringen ... die Methode im Listener wird nie aufgerufen ...Irgendwelche Ideen???
Mixkat
Ohne auf den Code zu schauen, kann ich nur vermuten, dass Sie den gleichen Fehler machen, den ich immer zu machen scheine. Ich baue einen großartigen Listener und vergesse dann, ihn an das richtige Objekt anzuhängen. Stellen Sie außerdem sicher, dass Sie den Listener in der onCreate () -Methode oder zumindest in Code, den Sie ausführen, an das Objekt anhängen, BEVOR Sie den Listener tatsächlich zum Abhören benötigen.
R Hughes
@RHughes Nein, ich hänge den Hörer an das Objekt an ... weiß nicht, was daran falsch ist ... es ist definitiv auf Erstellen ... trotzdem danke für die Antwort ...
mixkat

Antworten:

67

Tun

SharedPreferences.OnSharedPreferenceChangeListener spChanged = new
                           SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        // your stuff here
    }
};

In Ihrer PreferenceActivity, dh machen Sie es zu einem Mitglied Ihrer PreferenceActivityKlasse und dann registerOnSharedPreferenceChangeListener(spChanged)in der PreferenceActivity.onCreate()Methode.

Das ist was ich tue und ich habe nie ein Problem.

Andernfalls ist Ihre bedingte Überprüfung des Hörers schuld. Geben Sie den Code ein.

BEARBEITEN:

Aus dem von Ihnen veröffentlichten Code sollten Sie prefseine Klassenmitgliedsvariable erstellen, damit sie einen globalen Bereich hat.

Und tun Sie dies prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());stattdessen, getSharedPreferencesweil Sie diese Datei nicht erstellt haben.

Um eine Datei zu erstellen, müssen Sie verwenden PreferenceManager. PreferenceManagerVerwenden Sie, um eine zu erhalten Activity.getPreferenceManager().

techiServices
quelle
@sugarynugs Das ist genau das, was ich tue ... in der Tat habe ich den Code aus diesem anderen Beitrag kopiert ...
mixkat
@sugarynugs listener = new SharedPreferences.OnSharedPreferenceChangeListener () {public void onSharedPreferenceChanged (SharedPreferences-Einstellungen, String-Schlüssel) {// Implementierung}}); prefs.registerOnSharedPreferenceChangeListener (Listener)
Mixkat
1
@sugarynugs Listener ist eine Instanzvariable dieser Klasse. Nur um zu vermeiden, dass es gc ist.
mixkat
1
Wo ist die Variablendeklaration? Ist es ein Global? Plus falscher Code gepostet ... das Bit im Listener.
TechiServices
1
@RenniePet, Nein, Sie müssen den Listener für Einstellungen, der in der Anwendungsklasse registriert ist, nicht abmelden. Beispiel: Wenn Sie die Registrierung eines Listeners in der Aktivitätsklasse nicht aufheben, gibt der Garbage Collector nach dem Schließen der Aktivität keinen vom Aktivitätsobjekt zugewiesenen Speicher frei (der Präferenzmanager hat einen Verweis auf den Listener, der Listener einen Verweis auf die Aktivität). Aber Sie haben diesen Fall nicht mit der Anwendungsklasse.
Babay
67

PreferenceActivityImplementieren Sie in Ihrer Klasse die SharedPreferences.OnSharedPreferenceChangeListenerSchnittstelle. Fügen Sie onSharedPreferenceChangedIhrer Klasse die gewünschte Methode hinzu und registrieren Sie sie in der onCreate.

Siehe Beispielcode hier:

public class MyPreferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.fw_preferences); //deprecated
        PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // handle the preference change here
    }

}
Jonathan
quelle
1
Wie würden Sie die veraltete Zeile, die Sie in Ihrem Code haben, umgestalten? addPreferencesFromResource(R.xml.fw_preferences); //deprecated
Mattecalcio
1
@mattecalcio Ich weiß, ich bin spät dran, aber hier ist die neue Methode zum Laden in einer Einstellungs-XML: stackoverflow.com/a/13441715/1318194
2
Ist es eine gute Praxis, unregisterOnSharedPreferenceChangeListener (this) in onDestroy () von MainActivity auszuführen?
Andrii Kovalchuk
1
Ihre Antwort ist fantastisch, aber auch in den Dokumenten heißt es: Fügen Sie den Registrierungsteil zum Lebenslauf hinzu und fügen Sie den Teil zum Aufheben der Registrierung in der Pause für den Müllsammler hinzu.
Nochmals vielen
Zusammen mit der Implementierung der Schnittstelle OnSharedPreferenceChangeListenerund Register Listener ein onResumeund onPause
abmelden