Frage

ich einige Informationen als SharedPreferences gespeichert haben. Ich brauche, um den Zugang, dass die Informationen von outsite einer Aktivität (in einer Domain-Modell-Klasse). Also habe ich eine statische Methode in einer Aktivität erstellt, die ich verwende nur die gemeinsamen Vorlieben zu bekommen.

Das ist mir einige Probleme geben, da anscheinend ist es nicht möglich, die Methode „getSharedPreferences“ zu nennen, aus einer statischen Methode.

Hier ist die Nachricht Eclipse gibt mir:

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

Ich habe versucht zu arbeiten, um dieses durch eine Aktivitätsinstanz verwendet wird, wie folgt aus:

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

Dieser Code gibt einen Nullpunkt Ausnahme.

Gibt es ein work-around? Bin ich werde in einem Android-Code-Geruch, indem Sie versuchen, dies zu tun?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Das ist, weil in diesem Fall act ist eine Aufgabe, die Sie gerade erstellen. Sie haben zu lassen, Android, dass für Sie tun; getSharedPreferences() ist ein Verfahren der Context, (Activity, Service und andere Klassen erstreckt sich von Context). So müssen Sie Ihre Wahl:

  • Wenn die Methode innerhalb einer Aktivität oder eine andere Art von Kontext:

    getApplicationContext().getSharedPreferences("foo", 0);
    
  • Wenn die Methode außerhalb einer Aktivität oder eine andere Art von Kontext:

    // 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());
    

Andere Tipps

Cristian Antwort ist gut, aber wenn Sie Ihre gemeinsamen Präferenzen der Lage sein wollen von überall Zugriff auf die richtige Art und Weise wäre:

  1. Erstellen Sie eine Unterklasse von Application , z.B. public class MyApp extends Application { ...
  2. Stellen Sie das android:name Attribut Ihres <application>-Tages in der AndroidManifest.xml zu Punkt zu Ihrer neuen Klasse, z.B. android:name="MyApp" (so die Klasse von Android anerkannt)
  3. Im onCreate () -Methode der App-Instanz, speichern Sie Ihren Kontext (z this) auf ein statisches Feld mit dem Namen app und erstellen Sie eine statische Methode, dass die Rendite dieses Feld, z.B. getApp(). Anschließend können Sie diese Methode verwenden, später einen Kontext Ihrer Anwendung zu erhalten und damit Ihre gemeinsamen Vorlieben bekommen. : -)

Ich hatte ein ähnliches Problem, und ich löste es, indem Sie einfach den aktuellen Kontext auf die statische Funktion übergeben:

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 fordern, müssen Sie den Kontext speichern:

public static Context context;

Und innen OnCreate:

context = this;

Das Speichern des Kontextes als statischer Variable, kann zu Problemen führen, weil, wenn die Klasse zerstört wird, so dass die statischen Variablen sind. Dies geschieht manchmal, wenn die Anwendung unterbrochen und wird wenig Speicher. So stellen Sie sicher, dass der Kontext ist immer gesetzt, bevor Sie versuchen, es zu verwenden, auch wenn die Klasse den Kontext Einstellung zufällig zerstört.

Hier ist eine bessere Alternative Ihre gemeinsamen Präferenzen in statischen Feldern zu speichern.

  1. Ähnlich wie hier vorgeschlagen wurde, erstellen Sie eine Klasse, die Anwendung erstreckt
  2. Machen Sie den Konstruktor für die Klasse nehmen Kontext als Parameter.
  3. Verwenden Kontext gemeinsame Vorlieben zu erhalten und speichern sie in privaten Variablen.
  4. öffentliche Variablen Erstellen Sie die abgerufenen Daten zurückzukehren.

z

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;
    }
}

Nutzung 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 Vorlieben müssen oft zugegriffen werden, und effizient. Ich stelle mir vor, dass das Lesen und eine Zeichenfolge aus SharedPreferences Schreiben ist etwas langsamer als immer und eine statische Variable Einstellung (aber wahrscheinlich unwesentlich). Ich habe auch nur irgendwie zu verwenden statische Felder gewöhnten, Abrufen Preference Werte nur beim Start, und sie auf einem engen speichern.

Ich habe Liebe nicht meine Optionen für das Halten statische Verweise auf die SharedPreferences / Kontexten direkt, aber bisher diese Abhilfe hat genügt.

Meine Lösung:

  1. Erstellen Sie eine Settings-Klasse mit allen statischen Variablen, die Sie benötigen.

  2. Wenn die Anwendung initialisiert, SharedPreferences Felder abrufen und sofort alle Einstellungen Felder gesetzt (ich nenne ein "loadSharedPrefs ()" Methode am Ende des MainActivity des onCreate Methode).

  3. In der SettingsActivity des preferenceChangeListener der Initialisierung, setzen Sie das entsprechende statische Feld in der Klasse Einstellungen. (Ich nenne einen "setAppropriateSetting (Schlüssel, Wert)" Methode zu Beginn des SettingsActivity des onPreferenceChange ()).

Verwenden Sie Ihre statischen Einstellungen, wo immer, wann immer!

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top