Zugriff auf SharedPreferences über statische Methoden

Ich habe einige Informationen als SharedPreferences gespeichert. Ich muss auf diese Informationen von außerhalb einer Aktivität (in einer Domänenmodellklasse) zugreifen. Also habe ich in einer Aktivität eine statische Methode erstellt, mit der ich nur die gemeinsamen Einstellungen erhalte.

Das gibt mir einige Probleme, da es anscheinend nicht möglich ist, die Methode “getSharedPreferences” von einer statischen Methode aus aufzurufen.

Hier ist die Nachricht, die Eclipse mir gibt:

Cannot make a static reference to the non-static method getSharedPreferences(String, int) from the type ContextWrapper 

Ich habe versucht, dies zu umgehen, indem ich eine Activity-Instanz verwende:

 public static SharedPreferences getSharedPreferences () { Activity act = new Activity(); return act.getSharedPreferences("FILE", 0); } 

Dieser Code gibt eine Nullpunktausnahme.

Gibt es einen Workaround? Gehe ich in einen Android-Code-Geruch, indem ich versuche, dies zu tun?

Danke im Voraus.

Solutions Collecting From Web of "Zugriff auf SharedPreferences über statische Methoden"

In diesem Fall ist act ein Objekt, das Sie gerade erstellt haben. Du musst Android das für dich tun lassen; getSharedPreferences() ist eine Methode des Context , ( Activity , Service und andere classn erstrecken sich von Context ). Also, Sie müssen Ihre Wahl treffen:

  • Wenn sich die Methode in einer Aktivität oder einem anderen Kontext befindet:

     getApplicationContext().getSharedPreferences("foo", 0); 
  • Wenn die Methode außerhalb einer Aktivität oder eines anderen Kontexttyps liegt:

     // you have to pass the context to it. In your case: // this is inside a public class public static SharedPreferences getSharedPreferences (Context ctxt) { return ctxt.getSharedPreferences("FILE", 0); } // and, this is in your activity YourClass.this.getSharedPreferences(YourClass.this.getApplicationContext()); 

Cristian’s Antwort ist gut, aber wenn Sie in der Lage sein möchten, von überall auf Ihre gemeinsamen Einstellungen zuzugreifen, wäre der richtige Weg:

  1. Erstellen Sie eine Unterklasse der Application , z. B. public class MyApp extends Application {
  2. Setze das android:name Attribut deines -Tags in der AndroidManifest.xml, um auf deine neue class zu verweisen, zB android:name="MyApp" (also wird die class von Android erkannt)
  3. Speichern Sie in der onCreate () – Methode Ihrer App-Instanz Ihren Kontext (z. B. this ) in einem statischen Feld namens app und erstellen Sie eine statische Methode, die dieses Feld zurückgibt, z. B. getApp() . Sie können diese Methode später verwenden, um einen Kontext Ihrer Anwendung zu erhalten und damit Ihre gemeinsamen Einstellungen zu erhalten. 🙂

Ich hatte ein ähnliches Problem und triggerse es, indem ich einfach den aktuellen Kontext an die statische function übergab:

 public static void LoadData(Context context) { SharedPreferences SaveData = context.getSharedPreferences(FILENAME, MODE_PRIVATE); Variable = SaveData.getInt("Variable", 0); Variable1 = SaveData.getInt("Variable1", 0); Variable2 = SaveData.getInt("Variable2", 0); } 

Da Sie von außerhalb einer Aktivität anrufen, müssen Sie den Kontext speichern:

 public static Context context; 

Und drinnen OnCreate:

 context = this; 

Das Speichern des Kontexts als statische Variable kann zu Problemen führen, da die statischen Variablen bei der classnzerstörung zerstört werden. Dies passiert manchmal, wenn die App unterbrochen wird und der Arbeitsspeicher knapp wird. Stellen Sie nur sicher, dass der Kontext immer festgelegt ist, bevor Sie versuchen, ihn zu verwenden, selbst wenn die class, die den Kontext festlegt, zufällig zerstört wird.

Hier ist eine bessere Alternative zum Speichern Ihrer gemeinsamen Einstellungen in statischen Feldern.

  1. Ähnlich wie hier vorgeschlagen, erstellen Sie eine class, die Application erweitert
  2. Machen Sie den Konstruktor für Ihre class Context als Parameter.
  3. Verwenden Sie Ihren Kontext, um gemeinsame Einstellungen zu erhalten und sie in privaten Variablen zu speichern.
  4. Erstellen Sie öffentliche Variablen, um die abgerufenen Daten zurückzugeben.

z.B

 public class UserInfo extends Application{ private String SAVED_USERID; private String SAVED_USERNAME; public UserInfo(Context context) { SharedPreferences prefs = context.getSharedPreferences(FILE, MODE_PRIVATE); SAVED_USERNAME = prefs.getString("UserName", null); SAVED_USERID = prefs.getString("UserID", null); } public String getSavedUserName() { return SAVED_USERNAME; } public String getSavedUserID() { return SAVED_USERID; } } 

Verwendung in Ihrer Aktivität

  UserInfo user = new UserInfo(this.getApplicationContext()); String SAVED_USERNAME = user.getSavedUserName(); String SAVED_USERID = user.getSavedUserID(); 

Ich hatte das gleiche Bedürfnis – einige meiner Präferenzen müssen oft und effizient abgerufen werden. Ich stelle mir auch vor, dass das Lesen und Schreiben einer Zeichenkette aus SharedPreferences etwas langsamer ist als das Abrufen und Setzen einer statischen Variable (aber wahrscheinlich zu einem unbedeutenden Grad). Ich habe mich auch daran gewöhnt, statische Felder zu verwenden, Voreinstellungswerte nur beim Start abzurufen und sie beim Schließen zu speichern.

Ich mochte meine Optionen nicht, statische Verweise auf die SharedPreferences / Kontexte direkt beizubehalten, aber bisher reichte diese Problemumgehung aus.

Meine Lösung:

  1. Erstellen Sie eine Settings-class mit allen benötigten statischen Variablen.

  2. Wenn die Anwendung initialisiert wird, rufen Sie SharedPreferences-Felder ab und setzen Sie sofort alle Settings-Felder (ich rufe eine “loadSharedPrefs ()” -Methode am Ende der onCreate-Methode von MainActivity auf).

  3. Legen Sie in der Initialization des preferenceChangeListener von SettingsActivity das entsprechende statische Feld in der Settings-class fest. (Ich rufe zu Beginn von SettingsActivity onPreferenceChange ()) eine Methode “setApproplateSetting (key, value)” auf.

Verwenden Sie Ihre statischen Einstellungen überall und jederzeit!

 public static String getPreferenceValue(Context context) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); String key = context.getString(R.string.pref_key); String defaultVal = context.getString(R.string.pref_default); return sharedPreferences.getString(key,defaulVal); }