Android-Einstellungen: Wie lade ich die Standardwerte, wenn der Benutzer den Einstellungsbildschirm nicht verwendet hat?

119

Ich verwende eine PreferenceActivity, damit der Benutzer einige Werte festlegen kann. Ich füttere es die XML-Datei mit den definierten Einstellungen.

Ich habe alles android:defaultValue=""für sie eingestellt.

Wenn ich meine Anwendung starte, benötige ich die Einstellungen, oder wenn sie noch nicht manuell festgelegt wurden, möchte ich die Standardwerte:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

Allerdings, wenn android:defaultValue="true"ich noch bekomme false. Es sieht also so aus, als würden die im XML festgelegten Standardwerte nur beim Initialisieren des Einstellungsbildschirms verwendet.

Ich möchte die Standardwerte in der getBoolean()Methode nicht fest codieren . Gibt es also eine Möglichkeit, die Standardwerte zu erhalten, indem diese nur an einer Stelle definiert werden?

Peterdk
quelle

Antworten:

169

Diese Frage ähnelt meiner:

Initialisieren Sie die Einstellungen von XML in der Hauptaktivität

Verwenden Sie einfach diesen Code in der onCreateMethode:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

Es lädt Ihre Einstellungen aus XML und der letzte Parameter ( readAgain) garantiert, dass die Benutzereinstellungen nicht überschrieben werden. Wenn Sie das readAgainArgument auf setzen false, werden nur dann die Standardwerte festgelegt, wenn diese Methode in der Vergangenheit noch nie aufgerufen wurde, sodass Sie sich nicht jedes Mal, wenn Ihre Aktivität erstellt wird, Gedanken über das Überschreiben der Benutzereinstellungen machen müssen

Weitere Informationen finden Sie in PreferenceManager.setDefaultValues in der Android-API.

Pixel
quelle
Können wir dies für eine andere von uns erstellte SharedPrefrence-Variable verwenden?
Amol Gupta
8
Auch, wenn Ihre App mehrere Einstiegspunkte hat, legen Sie sie in onCreate()der Application.
SD
2
Dies funktioniert nicht, wenn ein Boolescher Wert verwendet wird und standardmäßig "false" verwendet wird, da der Standardeintrag in Android 2.x nicht erstellt wird. Ein Aufruf von ".getBoolean (KEY, true)" gibt immer true zurück. Für Android 4.x funktioniert es.
Gunnar Bernstein
10
Die Einstellung readAgainauf true hat nichts mit dem Überschreiben von Benutzereinstellungen zu tun. Aus dem Javadoc: Hinweis:
Devconsole
1
Für diejenigen, die Probleme mit dieser Lösung haben (sie funktioniert nicht oder teilweise oder nicht immer), siehe Steve Warings Antwort unten ( stackoverflow.com/a/25602205/4410376 ). Höchstwahrscheinlich haben Sie mehrere Shared-Prefs-Dateien, dh Android erstellt mehrere Shared-Prefs-Dateien basierend auf Ihrer Konfiguration oder Ihrem unordentlichen Code.
Hack06
27

Beachten Sie dies, wenn Sie verwenden
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

Um Einstellungen abzurufen, müssen Sie die Standardeinstellungen festlegen!
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

Beispielsweise:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

Ich hoffe das kann jemandem helfen.

Francesco Vadicamo
quelle
13

in der akzeptierten Antwort von Pixel:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

Es wird angegeben, dass die falseStandardeinstellungen nicht überschrieben werden. Dies ist nicht das, was es tut, es ist nur ein Effizienz-Flag, um das Parsen zu stoppen, wenn Ihre Anwendung mehr als einen Einstiegspunkt hat. Leider wird der Test nicht pro Präferenzdatei durchgeführt. Wenn Sie also mehr als eine Präferenzdatei haben, müssen Sie truealle außer der ersten codieren .

Wenn Sie sich Sorgen um die Effizienz machen, können Sie so etwas codieren.

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

Wenn Sie jemals mehr gemeinsame Einstellungen hinzufügen, setzen Sie SPL einfach auf eine hohe Zahl.

Steve Waring
quelle
2
Alternativ können Sie jederzeit eine Bulk-Einstellungen.xml erstellen, die Sie NUR zum Festlegen von Standardwerten verwenden. Zum Beispiel, wenn Sie haben R.xml.prefs_device, R.xml.prefs_testund R.xml.prefs_admin. Sie können eine Prefs-Datei erstellen, die alle Prefs aus den oben genannten enthält : R.xml.prefs_for_loading_default_values. Verwenden Sie das dann mit PreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
Chantell Osejo
In Bezug auf die Effizienz: Wenn Sie dies in onCreate()einer Unterklasse von Application(im Manifest registriert) aufrufen , wird es ohnehin nur einmal pro Anwendungsstart aufgerufen. Für die Leistung wäre es relevanter (wenn überhaupt), das Parsen nicht jedes Mal durchzuführen, wenn die App gestartet wird (stattdessen nur beim ersten Start), und genau das falsetut es. Es geht also eher darum, ob Sie bei jedem Start eine Überprüfung benötigen (z. B. wann neue Einstellungen hinzugefügt werden könnten) oder ob dies ausreicht, wenn dies beim ersten Start erfolgt (oder wenn die Einstellungen zurückgesetzt werden).
user905686
2

Zum Beispiel DialogPreferencemache ich Folgendes:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

mDefault kann sein:

  • mContext.getResources (). getString (attrs.getAttributeResourceValue (androidns, "defaultValue", 100));
  • etwas, das Sie in R indiziert haben.
Macarse
quelle
Ok, ich bin hier etwas verloren darüber, was Sie erreichen wollen. Ich möchte DialogPreference nicht aufrufen. Ich benötige den Standardwert, wenn der Benutzer die Einstellungen nicht verwendet.
Peterdk
Anstatt die Standardeinstellungen in Ihrer prefs.xml zu verwenden, können Sie Ihre eigenen Klassen erstellen. Sie können beispielsweise eine neue DialogPreference erstellen, die sich von DialogPreference aus erstreckt, und den onSetInitialValue überschreiben.
Macarse
0

Stellen Sie außerdem sicher, dass Sie die SharedPreferences noch nie verwendet haben. Um sicherzustellen, dass sie nicht geändert werden (was bedeutet, dass setDefaultValues ​​(this, xml, false) keine Auswirkungen hat), deinstallieren Sie Ihre App und laden Sie sie erneut hoch, um sicherzustellen, dass keine Werte berührt werden. Das hat mir geholfen.

wirthra
quelle