21

Angenommen, ich eine Anwendung, die Präferenzen auf zwei Dateien speichert, preferences1.xml und preferences2.xml. Dann kann ich Verweise auf die entsprechenden Objekte mit dem folgenden Code abrufen:Einstellung Standardwerte mehrerer SharedPreferences Instanzen/Dateien

SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE); 
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE); 

Auf diese Weise habe ich die Einstellungen für beide manipulieren können und registrieren Zuhörer für Änderungen auf beiden.

Ich habe einige Zweifel an der Initialisierung der beiden Dateien, mit setDefaultValues ​​:

Frage 1 - PreferenceFragment Kontext: Ich habe eine PreferenceActivity erstellt mit zwei PreferenceFragments und innerhalb der onCreate Methode von jedem Ich führe den folgenden Code (ersetzen Sie X durch 1 und 2 für Fragment 1 und 2):

PreferenceManager pm = getPreferenceManager(); 
pm.setSharedPreferencesName("preferencesX"); 

PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false); 

Ich habe gesehen, dass beiden Fragmente mit ihren Standardwerten setzen ihre Präferenzen korrekt nach dem Abwurf .. aber angesichts der Tatsache, dass ich nur eine einzige _has_set_default_values.xml Datei in dem shared_prefs Verzeichnis des App sehen kann, Wie versteht es, wenn Eigenschaften von preferences1.xml und preferences2.xml bereits festgelegt wurden? Diese Datei wird erstellt, sobald setDefaultValues ​​ aufgerufen wird in der ersten geöffneten PreferenceFragment, aber auch danach, wenn ich die zweite öffnen PreferenceFragment es korrekt initialisiert Standardwerte. Wie versteht es, dass es noch nicht initialisiert wurde preferences2.xml und was ist der Zweck von _has_set_default_values.xml angesichts der Tatsache, dass es keine Informationen darüber enthält, welche Preferences Dateien initialisiert wurden?

Frage 2 - Standard Aktivität Kontext: wenn ich meine app starten, das PreferenceActivity ist nicht die erste Aktivität gestartet und der Benutzer kann es nie öffnen, so mag ich die beiden Einstellungsdateien mit ihrem initialisieren Standardwerte auch in der Haupt Aktivität, wie kann ich das tun? Für voreingestellte gemeinsame Einstellungen ist es einfach:

Für zwei Präferenzdateien wie soll ich tun? Ich kann so etwas wie die folgenden nicht tun, da ich keine Instanz PreferenceManager wie in den PreferenceFragment Klassen abrufen kann:

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED 
pm.setSharedPreferencesName("preferences1"); 
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment1, false); 

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED 
pm.setSharedPreferencesName("preferences2");    
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment2, false); 

Hier im Hauptaktivität Ich habe nicht die Notwendigkeit, die Einstellungsdateien zu ändern auf dem die PreferenceManager funktioniert, da wir nicht in einer PreferenceActivity sind, möchte ich einfach diese beiden Dateien zu initialisieren ... irgendwelche Hilfe? Ich hoffe, ich habe eine klare Frage gestellt, wenn auch zu lange.

+1

@crazymaik Ich habe meine Antwort gelöscht, wie ich es nicht denke Beantwortet die Frage zufriedenstellend. Ich habe schon einige Stunden damit verbracht, dies zu untersuchen, und es ist immer noch ein vollkommenes Mysterium ... Hoffentlich kann jemand anderes etwas Licht darauf werfen. –

+0

können Sie mehr über SO Chat erklären? – KOTIOS

+0

Verwenden Sie ein Präfix ".Namespace" in einer einzelnen physischen Datei, um 2 logische Gruppen oder Kategorien von Präferenzen in einem einzigen Dateihandle zu verwalten. Ihre jeweiligen Fragmente sollten in der Lage sein, das NS-Präfix in einer Weise anzuwenden, die für Ihre CRUD-Operationen in den pref-Eigenschaften nicht zu störend ist. –

Antwort

-2

1) Ich nehme an, dass diese Standardwerte nur geladen werden, wenn die Methode getDefaultSharedPreferences() verwendet wird, und werden ignoriert, wenn Sie Ihre eigene Einstellungsdatei angeben. Nicht wirklich sicher in diesem.

2) Sie können sie für eine Anwendungsunterklasse einrichten.

http://developer.android.com/reference/android/app/Application.html

Application.onCreate ist das erste, was ausgeführt wird, wenn der Benutzer die App startet. Es ist ein zentraler Einstieg in Ihre App und daher ein guter Ort, um alle Daten zu initialisieren, die Ihre App systemweit benötigt.

Da die Anwendung ContextWrapper erweitert, haben Sie über die Methode getSharedPreferences (file, mode) Zugriff auf die SharedPreferences. Sie können damit Ihre zwei Einstellungsdateien abrufen.

0

Für Frage 1

Ich glaube, die _has_set_default_values.xml Datei nur eine andere Einstellungsdatei ist ... und es speichert Schlüssel/Wert-Paare in dort mit dem Schlüssel den Namen der Einstellungsdatei und mehr Der Wert ist, ob die Standardwerte festgelegt wurden.

Für Frage 2

Warum nicht verwenden Sie die Version von PreferenceManager.setDefaultValues ​​(), die den Namen der gemeinsamen Voreinstellungsdatei nimmt? Dies ist die Methode Unterschrift:

public static void setDefaultValues (Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain) 

http://developer.android.com/reference/android/preference/PreferenceManager.html

1

Sie eine Präferenz wie folgt erstellen:

public class MyPreference { 

    private static final String APP_SHARED_PREFS1 = "myPrefc1"; 
    private static final String APP_SHARED_PREFS2 = "myPrefc2"; 
    private SharedPreferences appSharedPrefs1; 
    private SharedPreferences appSharedPrefs2; 
    private Editor    prefsEditor1; 
    private Editor    prefsEditor2; 


    public MyPreference(Context context) { 
     this.appSharedPrefs1 = context.getSharedPreferences(APP_SHARED_PREFS1, Activity.MODE_PRIVATE); 
     this.appSharedPrefs2 = context.getSharedPreferences(APP_SHARED_PREFS2, Activity.MODE_PRIVATE); 
     this.prefsEditor1 = appSharedPrefs1.edit(); 
     this.prefsEditor2 = appSharedPrefs2.edit(); 
    } 

public void saveServices(String servicName, boolean isActivated) { 
     prefsEditor1.putBoolean(servicName, isActivated); 
     prefsEditor1.commit(); 
     prefsEditor2.putBoolean(servicName, isActivated); 
     prefsEditor2.commit(); 
    } 

auf Ihrem speichern Service oder etwas anderes wollen Sie mit Ihren Wünschen zu tun, werden die Daten speichern in beiden Dateien.

und für Ihre zweite Frage:

eine globale Klasse wie G

erstellen und dann Ihre Präferenz wie folgt erklären:

public class G extends Application{ 

    public static Activity currentActivity = null; 
    public static MyPreference myAppPref = null; 


    @Override 
    public void onCreate() { 

     super.onCreate(); 

     myAppPref = new MyPreference(G.this); 


    } 


} 

und wenn Ihre Haupttätigkeit ausgeführt wird, sollten Sie wie folgt tun :