2011-09-01 38 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); 

獲得在第二應用程序更新後的值。