2011-09-01 5 views
2

J'essaie d'utiliser les préférences partagées pour stocker mes paramètres d'applications, mais même si j'ai essayé de copier le tutoriel mieux que je peux je ne peux toujours pas le faire fonctionner. Voici les parties de ma classe:Problème étrange avec les préférences partagées dans Android

public class ActivitySettings extends PreferenceActivity { 

@SuppressWarnings("unused") 
private static String TAG = "ActivitySettings"; 

private static final String PREFS_NAME = "preferences"; 

private static final String DISABLE_CHECK = "disableCheck"; 
private static final String ALWAYS_CONFIRM = "alwaysConfirm"; 
private static final String NEVER_CONFIRM = "neverConfirm"; 
private static final String SHOW_NOTIFICATION = "showNotification"; 
private static final String SHOW_ON_BOOT = "showOnBoot"; 
private static final String HIDE_ICON = "hideIcon"; 
private static final String LOGGING = "logging"; 

private Context context = this; 

private CheckBoxPreference disableCodeCheck; 
private CheckBoxPreference alwaysAskForConf; 
private CheckBoxPreference neverAskForConf; 
private CheckBoxPreference showNotif; 
private CheckBoxPreference showAtBoot; 
private CheckBoxPreference hideIcon; 
private Preference exportData; 
private Preference importData; 
private Preference cleanUp; 
private Preference reset; 
private CheckBoxPreference logging; 

private boolean isDisableCodeCheck; 
private boolean isAlwaysAskForConf; 
private boolean isNeverAskForConf; 
private boolean isShowNotif; 
private boolean isShowAtBoot; 
private boolean isHideIcon; 
private boolean isLogging; 

private void loadPreferences() { 
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0); 

    isDisableCodeCheck = prefs.getBoolean(DISABLE_CHECK, false); 
    isAlwaysAskForConf = prefs.getBoolean(ALWAYS_CONFIRM, false); 
    isNeverAskForConf = prefs.getBoolean(NEVER_CONFIRM, false); 
    isShowNotif = prefs.getBoolean(SHOW_NOTIFICATION, false); 
    isShowAtBoot = prefs.getBoolean(SHOW_ON_BOOT, false); 
    isHideIcon = prefs.getBoolean(HIDE_ICON, false); 
    isLogging = prefs.getBoolean(LOGGING, false); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    addPreferencesFromResource(R.xml.settings); 

    disableCodeCheck = (CheckBoxPreference) findPreference("disable_code_check"); 
    alwaysAskForConf = (CheckBoxPreference) findPreference("always_ask_for_conf"); 
    neverAskForConf = (CheckBoxPreference) findPreference("never_ask_for_conf"); 
    showNotif = (CheckBoxPreference) findPreference("show_notif"); 
    showAtBoot = (CheckBoxPreference) findPreference("show_at_boot"); 
    hideIcon = (CheckBoxPreference) findPreference("hide_icon"); 
    exportData = findPreference("exp"); 
    importData = findPreference("imp"); 
    cleanUp = findPreference("clean_up"); 
    reset = findPreference("reset"); 
    logging = (CheckBoxPreference) findPreference("logging"); 

    loadPreferences(); 

    //here are also booleans modified 

@Override 
protected void onStop() { 
    super.onStop(); 
    savePreferences(); 
} 

private void savePreferences() { 
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0); 

    prefs.edit().putBoolean(DISABLE_CHECK, isDisableCodeCheck); 
    prefs.edit().putBoolean(ALWAYS_CONFIRM, isAlwaysAskForConf); 
    prefs.edit().putBoolean(NEVER_CONFIRM, isNeverAskForConf); 
    prefs.edit().putBoolean(SHOW_NOTIFICATION, isShowNotif); 
    prefs.edit().putBoolean(SHOW_ON_BOOT, isShowAtBoot); 
    prefs.edit().putBoolean(HIDE_ICON, isHideIcon); 
    prefs.edit().putBoolean(LOGGING, isLogging); 

    prefs.edit().commit(); 
} 

}

Voici ce qui se passe:

  1. il y a deux fichiers créés dans shared_prefs: preferences.xml et packagename_preferences.xml. Je ne sais pas pourquoi, PREFS_NAME est fourni.

  2. paramètres de chargement est effectué onCreate methos, épargne et commiting dans onStop

  3. en utilisant adb shell et le chat que je suis à la recherche dans des fichiers alors que l'application est en cours d'exécution et est le scénario ici:

    • je ouvre les paramètres et cochez sth et packagename_preferences.xml est créé avec la valeur correcte
    • je presse en arrière et le second fichier est créé - preferences.xml qui ressemble à ceci: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map />
    • quand j'ouvre à nouveau les réglages tout ressemble à la première exécution et les valeurs dans packagename_preferences.xml sont changées par défaut (?)
  4. Je sais qu'il ya et construit dans le mécanisme pour PreferenceActivity mais je ne veux pas utilisez-le car j'ai besoin d'accéder à d'autres paramètres d'autres activités.


EDIT


J'ai créé cette application:

package pl.test; 

import android.app.Activity; 
import android.content.SharedPreferences; 
import android.os.Bundle; 

public class TestActivity extends Activity { 
String s = "0"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    SharedPreferences sp = getSharedPreferences("pref", 0); 
    s = sp.getString("setting2", "1"); 
    s = "5"; 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    SharedPreferences sp = getSharedPreferences("pref", 0); 
    sp.edit().putString("setting2", s); 
    sp.edit().commit(); 
} 

}

Et il ne fonctionne pas n'enregistre pas seulement chaîne à pref .xml. Qu'est-ce qui ne va pas!?

Répondre

3

Votre problème est que vous générez un nouvel objet Editor à chaque appel de sp.edit(). Donc, votre appel sp.edit(). Commit() crée un nouvel éditeur qui n'a pas de modifications à valider.Essayez ceci:

private void savePreferences() { 
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor editor = prefs.edit(); 
    editor.putBoolean(DISABLE_CHECK, isDisableCodeCheck); 
    editor.putBoolean(ALWAYS_CONFIRM, isAlwaysAskForConf); 
    editor.putBoolean(NEVER_CONFIRM, isNeverAskForConf); 
    editor.putBoolean(SHOW_NOTIFICATION, isShowNotif); 
    editor.putBoolean(SHOW_ON_BOOT, isShowAtBoot); 
    editor.putBoolean(HIDE_ICON, isHideIcon); 
    editor.putBoolean(LOGGING, isLogging); 
    editor.commit(); 
} 

Alternativement, les méthodes de l'éditeur sont conçus pour être enchaînés, donc cela fonctionnerait aussi:

private void savePreferences() { 
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0) 
     prefs.edit().putBoolean(DISABLE_CHECK, isDisableCodeCheck) 
     .putBoolean(ALWAYS_CONFIRM, isAlwaysAskForConf) 
     .putBoolean(NEVER_CONFIRM, isNeverAskForConf) 
     .putBoolean(SHOW_NOTIFICATION, isShowNotif) 
     .putBoolean(SHOW_ON_BOOT, isShowAtBoot) 
     .putBoolean(HIDE_ICON, isHideIcon) 
     .putBoolean(LOGGING, isLogging) 
     .commit(); 
} 

Vous avez le même problème dans votre code de test, qui peut être fixé comme si :

@Override 
public void onStop() { 
    super.onStop(); 
    SharedPreferences sp = getSharedPreferences("pref", 0); 
    sp.edit().putString("setting2", s).commit(); 
} 
+0

Cela n'a pas aidé. Cependant, deux fichiers sont créés et les paramètres ne sont pas chargés. – BartoszCichecki

+0

La réponse a été modifiée - Elle devrait fonctionner maintenant. –

+0

Merci Chris. Ça marche pour moi. – Rockystech

1

Lors de la lecture des données lisibles du monde partagées par la première application, nous devrions

Remplacer

getSharedPreferences("PREF_NAME", Context.MODE_PRIVATE); 

avec

getSharedPreferences("PREF_NAME", Context.MODE_MULTI_PROCESS); 

deuxième application pour obtenir la valeur mise à jour dans la deuxième application.

Questions connexes