it-swarm.com.de

Android-Einstellungen: Wie werden die Standardwerte geladen, wenn der Benutzer den Bildschirm "Einstellungen" nicht verwendet hat?

Ich verwende eine PreferenceActivity, um den Benutzer einige Werte festlegen zu lassen ..__ Ich füttere die XML-Datei mit den definierten Einstellungen.

Ich habe alle 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); 

Bei Android:defaultValue="true" bekomme ich trotzdem false. Es sieht also so aus, als würden die in XML definierten defaultValues ​​nicht überall verwendet, sondern beim Initialisieren des Bildschirms "Einstellungen".

Ich möchte die Standardwerte in der getBoolean()-Methode nicht hartcodieren. Gibt es eine Möglichkeit, die Standardwerte zu erhalten, indem Sie diese nur an einer Stelle definieren?

108
Peterdk

diese Frage ist meiner ähnlich:

initialize-preferences-from-xml-in-main-activity

Verwenden Sie einfach diesen Code in der onCreate-Methode:

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

Ihre Voreinstellungen werden aus XML geladen, und der letzte Parameter (readAgain) garantiert, dass die Benutzervoreinstellungen nicht überschrieben werden.

Werfen Sie einen Blick auf PreferenceManager.setDefaultValues ​​ in der Android-API, um weitere Informationen zu erhalten.

159
pixel

Seien Sie sich dessen bewusst, wenn Sie verwenden
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

um einstellungen abzurufen musst du verwenden
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
, um die Standardeinstellungen festzulegen!

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

Ich hoffe das kann jemandem helfen.

27

in Pixel akzeptierte Antwort:

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

es wird angegeben, dass false bedeutet, dass Standardwerte nicht überschrieben werden. Dies ist nicht das, was es tut, es ist nur ein Effizienz-Flag, um die Analyse zu stoppen, wenn Ihre Anwendung mehr als einen Einstiegspunkt hat. Leider wird der Test nicht per Voreinstellungsdatei durchgeführt. Wenn Sie also mehr als eine Einstellungsdatei haben, müssen Sie true für alle außer der ersten codieren.

Wenn Sie sich Sorgen um die Effizienz machen, könnten 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 weitere gemeinsame Einstellungen hinzufügen, setzen Sie einfach SPL auf eine hohe Zahl.

12
Steve Waring

Zum Beispiel DialogPreference erweitern, mache 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. indexiert haben.
2
Macarse

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 Auswirkung hat), deinstallieren Sie Ihre App und laden Sie sie erneut hoch, um sicherzustellen, dass keine Werte berührt werden. Das hat mir geholfen.

0
wirthra