【发布时间】:2012-03-04 23:27:48
【问题描述】:
我正在编写一个带有preferencesActivity 的android 应用程序,其中在我的preferencesActivity 实例中所做的选择会影响显示的其他首选项项目的值。虽然我能够以编程方式更改底层 SharedPreferences 项的值,但这些更改的值不会反映在显示的列表项中,直到我退出我的 preferencesActivity 并重新加载它。下面是我的设置类和 xml 文件的精简版本,它说明了问题。如果用户使用键 instrumentList 将 Guitar 设置为首选项的值,我希望使用键 tuneChoice 的首选项恢复为标准。
//necessary import declarations go here
public class Settings extends PreferenceActivity implements OnSharedPreferenceChangeListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(this);
app_preferences.registerOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged (SharedPreferences sharedPreferences, String key) {
Log.d("onSharedPreferencesChanged", "sharedPreferences changed. key: " + key);
Editor preferencesMod = sharedPreferences.edit();
String instrumentChoice = sharedPreferences.getString("instrumentList", "Guitar");
if(key.equals("instrumentList")) {
Log.d("Settings", "key is instrumentList. chooseTuning before if: " + sharedPreferences.getString("chooseTuning", "no luck"));
if(instrumentChoice.equals("Guitar")) {
preferencesMod.putString("chooseTuning", "Standard");
preferencesMod.commit();
Log.d("Settings", "chooseTuning after if: " + sharedPreferences.getString("chooseTuning", "ciao"));
}
}
}
}
xml文件preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="Settings">
<ListPreference android:title="Choose an Instrument" android:key="instrumentList" android:entryValues="@array/instruments" android:entries="@array/instruments"/>
<ListPreference android:title="Choose Tuning" android:key="chooseTuning" android:entryValues="@array/tuningChoices" android:entries="@array/tuningChoices" android:persistent="true"/>
</PreferenceScreen>
我可以在我的 onSharedPreferenceChanged 方法中再次调用 addPreferencesFromResource 并加载所有首选项的副本,显示在旧项目下方,并具有正确的值。如果我能想出一些方法来取消在 onCreate 期间调用的初始 addPreferencesFromResource,我想我会被设置。
任何帮助将不胜感激,谢谢
【问题讨论】:
-
在这里查看约瑟夫的答案。 stackoverflow.com/questions/8003098/…
标签: android preferences sharedpreferences