Wie erhalte ich die SharedPreferences von einer PreferenceActivity in Android?


373

Ich verwende eine PreferenceActivity, um einige Einstellungen für meine Anwendung anzuzeigen. Ich fülle die Einstellungen über eine XML-Datei auf, sodass mein onCreate (und die vollständigen Klassenmethoden) folgendermaßen aussehen:

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

Das Javadoc von PreferenceActivity PreferenceFragment gibt dies an

Diese Einstellungen werden automatisch in SharedPreferences gespeichert, wenn der Benutzer mit ihnen interagiert. Rufen Sie getDefaultSharedPreferences (android.content.Context) mit einem Kontext im selben Paket wie diese Aktivität auf, um eine Instanz von SharedPreferences abzurufen, die von der Voreinstellungshierarchie in dieser Aktivität verwendet wird.

Aber wie bekomme ich den Namen der SharedPreference in einer anderen Aktivität? Ich kann nur anrufen

getSharedPreferences(name, mode)

In der anderen Aktivität benötige ich jedoch den Namen der SharedPreference, die von der PreferenceActivity verwendet wurde. Wie lautet der Name oder wie kann ich ihn abrufen?

Antworten:


721
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

Aktualisieren

Gemäß den gemeinsamen Einstellungen | Android Developer Tutorial (Teil 13) von Sai Geetha MN,

Viele Anwendungen bieten möglicherweise eine Möglichkeit, Benutzereinstellungen für die Einstellungen einer bestimmten Anwendung oder Aktivität zu erfassen. Um dies zu unterstützen, bietet Android einen einfachen Satz von APIs.

Einstellungen sind normalerweise Name-Wert-Paare. Sie können als "Freigegebene Einstellungen" für verschiedene Aktivitäten in einer Anwendung gespeichert werden (beachten Sie, dass sie derzeit nicht für mehrere Prozesse freigegeben werden können). Oder es kann etwas sein, das für eine Aktivität spezifisch gespeichert werden muss.

  1. Freigegebene Einstellungen: Die freigegebenen Einstellungen können von allen Komponenten (Aktivitäten, Dienste usw.) der Anwendungen verwendet werden.

  2. Einstellungen für Aktivitäten: Diese Einstellungen können nur innerhalb der jeweiligen Aktivität verwendet werden und können nicht von anderen Komponenten der Anwendung verwendet werden.

Gemeinsame Einstellungen:

Die gemeinsamen Einstellungen werden mit Hilfe der getSharedPreferencesMethode der ContextKlasse verwaltet. Die Einstellungen werden in einer Standarddatei (1) gespeichert, oder Sie können einen Dateinamen (2) angeben , der zum Verweisen auf die Einstellungen verwendet werden soll.

(1) Die empfohlene Methode ist die Verwendung im Standardmodus ohne Angabe des Dateinamens

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) So erhalten Sie die Instanz, wenn Sie den Dateinamen angeben

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATEist die Betriebsart für die Einstellungen. Dies ist der Standardmodus und bedeutet, dass nur die aufrufende Anwendung auf die erstellte Datei zugreifen kann. Weitere zwei unterstützte Modi sind MODE_WORLD_READABLEund MODE_WORLD_WRITEABLE. In einer MODE_WORLD_READABLEanderen Anwendung kann die erstellte Datei gelesen, aber nicht geändert werden. Bei MODE_WORLD_WRITEABLEanderen Anwendungen haben Sie auch Schreibberechtigungen für die erstellte Datei.

Sobald Sie die Voreinstellungsinstanz haben, können Sie die gespeicherten Werte wie folgt aus den Voreinstellungen abrufen :

int storedPreference = preferences.getInt("storedInt", 0);

Zum Speichern von Werten in der Voreinstellungsdatei muss ein SharedPreference.EditorObjekt verwendet werden. Editorist eine verschachtelte Schnittstelle in der SharedPreferenceKlasse.

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Der Editor unterstützt auch Methoden wie remove()und clear()zum Löschen der Voreinstellungswerte aus der Datei.

Aktivitätseinstellungen:

Die freigegebenen Einstellungen können von anderen Anwendungskomponenten verwendet werden. Wenn Sie die Einstellungen jedoch nicht mit anderen Komponenten teilen müssen und über private Aktivitätseinstellungen verfügen möchten, können Sie dies mithilfe getPreferences()der Aktivitätsmethode tun . Die getPreferenceMethode verwendet die getSharedPreferences()Methode mit dem Namen der Aktivitätsklasse für den Namen der Einstellungsdatei.

Im Folgenden finden Sie den Code zum Abrufen der Einstellungen

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

Der Code zum Speichern von Werten ist auch der gleiche wie bei gemeinsamen Einstellungen.

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Sie können auch andere Methoden verwenden, z. B. das Speichern des Aktivitätsstatus in der Datenbank. Hinweis Android enthält auch ein Paket namens android.preference. Das Paket definiert Klassen zum Implementieren der Benutzeroberfläche für Anwendungseinstellungen.

Weitere Beispiele finden Sie im Beitrag zur Datenspeicherung von Android auf der Entwicklerseite.


55
+1: Du hast meinen Tag gerettet. Keines der Tutorials / Beispiele im Internet erzählt davon. Alles, was sie über Funktionen und Anpassungen sprechen, aber nicht, wie man es liest.
Ankitjaininfo

1
Siehe mein Update der Antwort, und der Dateiname ist so etwas wie, package.prefsaber ich bin nicht sicher.
Pentium10

1
Danke für den Code. Es gibt nur eine kleine Sache, die mich verwirrt: SharedPreference ist eine Schnittstelle. Wo ist also der eigentliche Code implementiert, der alle Methodenaufrufe verarbeitet?
x1886x

1
Ich wünschte, ich hätte dies eine Woche gelesen, bevor ich meine Zeit damit verschwendet hätte, einige dumme Nerds Antworten / Kommentare in ganz SE zu lesen, die glauben zu wissen, wann sie es tatsächlich nicht tun. Danke @ Pentium10, besitzt du einen Blog, danke nochmal, schätze es wirklich :)
Sanjeevcn

1
Anstelle von editor.commit () können Sie auch editor.apply () verwenden. Der Unterschied besteht darin, dass commit () Ihre Änderungen synchron schreibt und apply sie asynchron schreibt. Dies macht Ihre Benutzeroberfläche schneller.
Hashim Akhtar

29

Wenn Sie keinen Zugriff auf haben getDefaultSharedPreferenes(), können Sie getSharedPreferences(name, mode)stattdessen verwenden, müssen Sie nur den richtigen Namen eingeben.

Android erstellt diesen Namen (möglicherweise basierend auf dem Paketnamen Ihres Projekts?). Sie können es erhalten, indem Sie den folgenden Code in a einfügen SettingsActivity onCreate()und sehen, was preferencesNameist.

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

Die Zeichenfolge sollte so etwas wie sein com.example.projectname_preferences. Harter Code, der irgendwo in Ihrem Projekt ist, und geben Sie ihn an weiter, getSharedPreferences()und Sie sollten bereit sein, loszulegen.


1
Die Quelle für Aktivitäten lautet: public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
Tatarize

22

Deklarieren Sie diese Methoden zuerst.

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

Rufen Sie dies dann auf, wenn Sie eine Präferenz setzen möchten:

putPref("myKey", "mystring", getApplicationContext());

Nennen Sie dies, wenn Sie eine Präferenz erhalten möchten:

getPref("myKey", getApplicationContext());

Oder Sie können dieses Objekt https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo verwenden, das alles noch weiter vereinfacht

Beispiel:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);

Warum nicht editor.apply () verwenden? anstatt für die Verarbeitung im Hintergrund
festzuschreiben

4

Kontext überall herumgeben zu müssen, nervt mich wirklich. Der Code wird zu ausführlich und nicht mehr handhabbar. Ich mache das stattdessen in jedem Projekt ...

public class global {
    public static Activity globalContext = null;

und setzen Sie es in der Hauptaktivität erstellen

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

Außerdem sollten alle Einstellungsschlüssel sprachunabhängig sein. Ich bin schockiert, dass niemand dies erwähnt hat.

getText(R.string.yourPrefKeyName).toString()

Nennen Sie es jetzt ganz einfach so in einer Codezeile

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);

4
Was ist der Vorteil, wenn die Schlüsselsprache unabhängig ist? Sie werden dem Benutzer nie gezeigt, oder?
Gerd

1
Bitte verwenden Sie aus Liebe zu Gott niemals eine Aktivität als globalen Kontext. Wenn Sie einen globalen Kontext verwenden müssen, verwenden Sie dazu eine benutzerdefinierte Anwendungsklasse.
Thorben

1
@ Thorben vereinbart. Oder einfachgetApplicationContext()
OneCricketeer

3

Wenn Sie ein Kontrollkästchen haben und dessen Wert abrufen möchten, dh wahr / falsch in einer Java-Datei.

Verwenden--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`

0

Aktualisiert 2019

Sie können einfach die PowerPreferenceBibliothek verwenden

https://github.com/AliEsaAssadi/Android-Power-Preference

Gemeinsame Präferenzinstanz abrufen

Um die Standardinstanz zu erhalten, müssen Sie nur aufrufen

PowerPreference.getDefaultFile()

Oder wenn Sie eine bestimmte Voreinstellungsdatei möchten

PowerPreference.getFileByName(fileName)

Daten schreiben:

PowerPreference.getDefaultFile().put(key,value)

Daten abrufen

PowerPreference.getDefaultFile().getString(key,value)

Wie geht PowerPreference mit dem Kontextteil um? Zum Lesen der freigegebenen Einstellungen ist ein Kontext erforderlich, nicht wahr? Ich bin neu in Android und versuche zu verstehen.
Yeti

0

Versuchen Sie, dem Quellcode zu folgen, der bei mir funktioniert hat

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.