2011-09-01 39 views
2

我试图使用共享首选项来存储我的应用程序设置,但即使我试图复制教程最好,因为我可以我仍然无法使其工作。这里是我的类的部分: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(); 
} 

}

这里是发生了什么:

  1. 有在shared_prefs创建两个文件:的preferences.xml和packagename_preferences.xml。不知道为什么会提供PREFS_NAME。

  2. 加载设置在的onCreate methos完成,保存和使用亚行外壳和猫我在找到文件,同时应用程序正在运行和在这里的onStop

  3. commiting是情景:

    • 我打开设置,并勾选......而packagename_preferences.xml与正确的价值创造
    • 我按回到第二个文件被创建 - 的preferences.xml看起来像这样: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map />
    • 当我打开的设置重新一切看起来都像第一次运行和packagename_preferences.xml值更改为默认(?)
  4. 我知道有和内置机制PreferenceActivity但我不希望使用它,因为我需要访问其他活动的其他设置。


编辑


我建立了一个这样的应用程序:

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(); 
} 

}

而且它不工作,它只是不串保存到PREF .XML。哪里不对!?

回答

3

您的问题是,您每次调用sp.edit()都会生成一个新的Editor对象。所以你的调用sp.edit()。commit()正在创建一个没有改变提交的新编辑器。试试这个:

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(); 
} 

另外,编辑方法被设计成链,因此这也将工作:

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(); 
} 

您的测试代码同样的问题,它可以是固定的,像这样:

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

它没有帮助。尽管如此,还是会创建两个文件,并且不会加载设置。 – BartoszCichecki

+0

答案已被编辑 - 现在应该工作。 –

+0

谢谢克里斯。这个对我有用。 – Rockystech

1

在读取由第一应用程序,我们应该

共享世界可读数据在第二个应用程序替换

getSharedPreferences("PREF_NAME", Context.MODE_PRIVATE); 

getSharedPreferences("PREF_NAME", Context.MODE_MULTI_PROCESS); 

获得在第二应用程序更新后的值。