SharedPreferences werden nicht gespeichert/geladen in PreferenceActivity
EDIT: Der unten beschriebene problem wurde durch einen sehr eigenartigen Gerät Problem nicht verursacht durch eine Codierung-problem.
Ich habe eine preferenceActivity in denen ich viele checkBoxPreferences.
Die checkBoxPreference ist wohl zu retten, die die Standard-shared-preferences-Datei, und dann wieder aufgerufen werden, wenn ich öffnen Sie die app, um die Aktualisierung der Benutzeroberfläche.
Dies nicht geschieht, wie es wohl werden.
Wenn ich die app schließen und öffnen Sie wieder, meine Werte bleiben wie Sie sind, angenommen zu werden, aber wenn ich den task-manager zum beenden der app oder wenn ich schalten Sie das Telefon (wenn die app nicht läuft), dann wird die defaultValues erneut aufgerufen.
So, ich habe eine SharedPreference in meinem onResume (), um es zu testen.
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Ich dann überprüfen, um zu sehen, ob es ist ein Schlüssel, sharedpreference.
pref.contains("myCheckBoxPreference");
Wenn ich schließen und öffnen Sie es wieder auf, es wird true zurückgegeben. wenn ich schließen mit dem task-manager oder schalten Sie das Telefon aus und wieder ein, dann gibt Sie false zurück.
So, ich habe versucht, manuell die Einstellung der SharedPreference
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("myCheckBoxPreference", myCheckBoxPreference.isChecked());
editor.commit();
und dann rief ich, dass, wenn die checkboxpreference Wert geändert. Ich habe auch versucht, Sie anzurufen, es in onStop und onPause. Noch, wenn ich die app schließen und öffnen Sie es wieder auf, pref.enthält den Wert true zurück, aber wenn ich schalten Sie das Telefon aus und wieder ein, gibt Sie false zurück.
So, ich habe dann versucht, mit einer SharedPreferences-Datei.
In der Klasse Erklärung:
public static final String PREFS = "prefs";
Und in der onResume():
SharedPreferences pref = this.getSharedPreferences(PREFS, 0);
Gleiche Verhalten, pref.enthält noch gibt true zurück, wenn ich nur die app schließen und öffnen Sie es wieder auf, aber es gibt false zurück, wenn ich die Stromversorgung des Telefons aus und wieder ein.
Habe ich dann versucht, die änderung der Wert des Schlüssels von myCheckBoxPreference zu etwas, das NICHT mit dem xml-Schlüssel für die CheckBoxPreference, und es hatte immer noch den gleichen Effekt.
Und ich deinstalliert die Anwendung aus dem Telefon, dann angetrieben, das Telefon aus-und wieder einschalten, und dann re-installiert und es hat immer noch den gleichen Effekt.
InformationsquelleAutor der Frage Jakar | 2011-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich löste es, ich bin mir ziemlich sicher. Es gibt keine code-Fehler auf meinem Teil, und es gibt kein Problem mit meiner app zu löschen (ich glaube nicht, sowieso.)
Erstellte ich ein neues Projekt namens ""testproj"", dann kopierte ich den code von meinen Einstellungen PreferenceActivity, klebte es in die TestprojActivity, und ich kopiert den code aus der xml-darauf verlassen, dann eingefügt, die in der main.xml der "TestProj".
Ich dann installiert "TestProj" auf dem Samsung Captivate, verändert die Einstellungen um, räumte den ram über den RAM-management (eine Funktion der custom ROM die ich habe), und die Einstellungen stecken. Ich habe dann power einschalten des Telefons und die Einstellungen waren noch da, wie würde ich konfiguriert.
Blieben Sie beide, wenn ich manuell mit:
ohne manuell speichern auf die SharedPreferences.
Da es nicht mein Handy, ich habe es nicht versucht noch, aber ich nehme an, eine Fabrik-Daten zurücksetzen beheben würde es völlig
EDIT: ich war in der Lage zu testen, die auf einem neuen Samsung Captivate und einem Samsung infuse, und es funktionierte.
Ich verlor viel von meiner Zeit versucht, dies herauszufinden, und ich hoffe, dass es jemandem hilft. 🙂
InformationsquelleAutor der Antwort Jakar
Stieß ich auf ein möglicherweise ähnliches problem auf einem Samsung Galaxy S, wo die Berechtigungen für die Einstellungen XML-Datei hatte sich irgendwie verändert/beschädigt.
Dem Protokoll ergeben, einige host-Prozess wurde nicht die Datei zu Lesen, so dass alle Einstellungen auf Ihre Standardwerte zurückgesetzt werden. Ich weiß nicht mehr die genaue Fehlermeldung, aber es war entlang der Linien von "permission denied for /path/to/preferences/file.xml".
Die Auflösung war für mich zu löschen, die die Anwendung Daten über Einstellungen, Anwendungen, Anwendungen Verwalten, die Anwendung Daten zu Löschen. Dies löscht die preference-Datei, die im Zusammenhang mit der app und das problem sofort verschwunden.
Bin ich davon ausgegangen, es war ein Isoliertes Ereignis, wie ich habe nicht es wieder auf eine Vielzahl von Android-Geräte (einschließlich des Galaxy S II).
InformationsquelleAutor der Antwort Paul Lammertsma
Auf dem client die Haupt-test-Gerät kam ich über das gleiche Thema. Das verwendete Gerät ist ein Samsung Galaxy S mit SDK-level 8 (2.2.1).
Das seltsame Verhalten ist, dass entweder
SharedPreferences
werden nicht gespeichert, oder, wie nach einem factory-reset sind Sie auch persistent, das heißt Sie werden nicht gelöscht, nachdem Sie neu installiert die Anwendung.Aufgrund der aktuellen Verteilung von 2.2.x, und die Anzahl der Samsung-Galaxy-S-Geräte verkauft werden, mehrere Millionen, die Wahrscheinlichkeit eines Auftretens dieses Problems ist bezeichnend.
So kann es als entscheidend, um eine Problemumgehung implementieren, für das speichern von Einstellungen.
Für das sammeln von detaillierten Eigenschaften zu isolieren, die diese Problemumgehung in einer scharfen Weise könnte jeder, auch mit Blick auf diese Frage bitte geben Sie die entsprechende kernel-version (
System.getProperty("os.version"
) hier?Ich dachte an so etwas wie dieses:
Kann ich nach dem eigentlichen code auch hier, sobald es fertig ist und jemand Interesse hat.
EDIT: einige zusätzliche Informationen:
Geräte, Einfassungen, Ausgabe:
Ähnliche Geräte, die NICHT mit Blick auf diese Frage:
InformationsquelleAutor der Antwort klaus
Versuchen Sie, löschen Sie den editor, bevor Sie Ihre Werte. Ich hatte das gleiche problem und es funktionierte für mich.
Beispiel:
InformationsquelleAutor der Antwort Mihai Enea
Ist es möglich, um das Problem der Berechtigungen mithilfe sharedUserId, die sollte das gleiche für alle von Ihr signierte apps.
http://developer.android.com/reference/android/R.attr.html#sharedUserId
InformationsquelleAutor der Antwort Chrispix
Ich hatte auch ein problem mit dem speichern und dann abrufen von Daten. Ich hatte meinen Laden und Speichern von code in einer Klasse, die Sie erweitert die Anwendung, weil ich wollte, eine einzelne Instanz von meine Daten. Ich konnte sehen, wie der String gespeichert wird, kann keine Fehler im LogCat und doch, wenn ich versuche, es zu laden, wieder kein Fehler, mein String leer ist. Ich habe nie überprüft, ob die Daten tatsächlich ging in der Datei, so habe ich keine Ahnung ob es eine Störung auf Speichern oder Laden, oder beides.
Mein code war mehr oder weniger wie folgt: (comboToSave ist einfach eine Zeichenkette generiert, die durch Gson von einer einfachen Daten-Klasse)
in eine Methode zu speichern:
anderen Methode zu laden:
Nach viel Kopf kratzen und nicht wissen, was zu tun ich änderte den code ruft den sharedPref Wert von
SharedPreferences sharedPref = Aktivität.getPreferences(Kontext.MODE_PRIVATE);
zu
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Gibt es einige mehr hier auf den Unterschied zwischen den beiden (obwohl in meinem Fall scheint es genau das gleiche)
Immer noch das Ergebnis auf meinem Galaxy S3 war das gleiche. Allerdings testen Sie beide Versionen auf andere Geräte, einschließlich VDs (virtuelle Geräte) gearbeitet.
In der ersten version des Codes, die ich Bestand die Aktivität aus der aufrufenden Aktivität; zum speichern von Aktivitäten, wo das Letzte bit der Daten aus der Benutzer und zum laden von meinem Haupt-Aktivität so, dass ich es fertig, wenn die app gestartet wird.
Spielte ich mit uninsalling die app und re-Installation, drehen Sie das Gerät aus und wieder an Letzte Nacht ohne Erfolg.
Habe ich nun die save-und load-Methoden von der application-Klasse der Tätigkeit, wo ich die input-also sowohl das laden und speichern von code ist jetzt in der gleichen Aktivität. Ich habe getestet, mit beiden Varianten des Codes und Sie funktionieren beide. Ich bekomme zurück, was ich sparen. Ich zog dann den code zurück an die Anwendung Klasse und es funktioniert; dies führt mich zu glauben, dass irgendwie alle mit der Installation/deinstallation habe ich es irgendwie geschafft es zum laufen zu bringen. Punkt ist: der code richtig ist - wenn es nicht funktioniert, das Gerät und/oder Einstellungen wahrscheinlich Schuld
InformationsquelleAutor der Antwort JJE
Ich habe das gleiche problem, und ich litt eine Weile , schließlich fand ich die Lösung ,
und es ist so einfach , geben Sie einfach die direkte Referenz auf die Aktivität , und verwenden Sie keine Allgemeinen Kontext
den code oben ist der Konstruktor der Klasse, die ich geschrieben habe, für session-management , und
und wenn ich es im code in der main-ActivityFramgment in einem AsyncTask ich es so nennen
wo referanct2thisActivity ist definiert in der "onCreate" Funktion von fragment-Aktivitäten wie diese
hoffe, das hilft anderen in der Zukunft
InformationsquelleAutor der Antwort Light Tiger