【发布时间】:2016-12-24 20:07:53
【问题描述】:
我的偏好值没有保存,每次我阅读 SharedPreferences 文件时,它都会返回默认值;当用户做出选择时(例如在ListPreference 中选择一个选项),系统应该会自动处理更改,所以我不知道为什么我的应用程序没有发生这种情况。
根据google
“当用户更改设置时,系统会为您更新 SharedPreferences 文件中的相应值。您应该直接与关联的 SharedPreferences 文件交互的唯一时间是当您需要读取该值以便根据用户的设置确定应用的行为。”
我应该在我的OnSharedPreferenceChangeListener 中操作SharedPreference.Editor 实例还是我需要做其他事情来使用户设置的值保持不变?
代码中的问题:由于这种误解,我的代码不会保留用户设置值(当我在 MainActivity 的 OnCreate 中读取 SharedPreference 文件时始终选择默认值)。就像现在一样,在我的 Preferences 菜单 View 中选择的按钮在应用程序重新启动时仍然存在,但似乎在此菜单中选择一个选项不会将键值保存到 SharedPreferences 文件中。
我需要做什么才能使用户在我的 ListPreference 中设置的值保持不变?
MainActivity
public class MainActivity extends FragmentActivity {
private static int prefWoodColor; //saved pref variable for OpenGL neck texture
private SharedPreferences settings;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
//Restore preferences
settings = PreferenceManager.getDefaultSharedPreferences(this);
prefWoodColor = Integer.parseInt(settings.getString(this.KEY_PREF_WOOD_TYPE, "Maple"));
...
}
}
偏好活动
public class FragmentSettingsMenu extends com.takisoft.fix.support.v7.preference.PreferenceFragmentCompat {
private SharedPreferences.OnSharedPreferenceChangeListener listener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from the XML resource
addPreferencesFromResource(R.xml.preferences);
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("pref_wood")) {
Preference woodPref = findPreference(key);
String color = woodPref.getSharedPreferences().getString(key, "Maple");
//Should I be calling edit.apply() logic here?
}
}
};
}
...
}
Preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
android:title="Settings"
<ListPreference
android:key="pref_wood"
android:title="@string/pref_wood"
android:dialogTitle="@string/pref_wood"
android:entries="@array/pref_wood_entries"
android:entryValues="@array/pref_wood_values"
android:defaultValue="@string/pref_wood_default" />
</PreferenceScreen>
Strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">MyApp</string>
<string name="dummy_button">Dummy Button</string>
<string name="dummy_content">DUMMY\nCONTENT</string>
<!--Preference Menu Strings-->
<string name="pref_wood">Wood Style</string>
<string-array name="pref_wood_entries">
<item>"Maple"</item>
<item>"Cedar"</item>
<item>"Oak"</item>
</string-array>
<string-array name="pref_wood_values">
<item >0</item>
<item >1</item>
<item >2</item>
</string-array>
<string name="pref_wood_default">Maple</string>
</resources>
【问题讨论】:
-
系统为您保存。检查首选项键在代码和 XML 之间是否正确匹配。此外,如果您的默认值为“Maple”,则将值解析为 int 是没有意义的。
-
@samgak 检查更新的编辑,我已经包含了我的preferences.xml 文件,所以你可以看到没有不匹配(据我所知)。我使用 strings.xml 文件为我的 ListPreference 中的每个选项指定值,因此将其解析为整数确实有意义,因为我已经编写了代码以根据数字代码而不是字符串更新木材纹理。
-
默认值应该是 entryValues 数组中的默认值,而不是条目(在您的情况下为“0”)
-
@samgak 你说哪一行代码应该改变?另外,我认为这不会解决无法正确保存/读取值的问题。
-
getString 的参数。你是对的,它不会解决保存/阅读问题。 this.KEY_PREF_WOOD_TYPE 是否等于“pref_wood”?
标签: java android sharedpreferences android-preferences