Я пишу приложение для Android с параметром preferencesActivity, в котором выбор, сделанный в моем экземпляре preferencesActivity, влияет на значения других отображаемых элементов настроек. Хотя я могу изменять значения базовых элементов SharedPreferences программным способом, эти измененные значения не отражаются в отображаемых элементах списка, пока я не выйду из своего параметра preferencesActivity и не перезагружу его. Ниже представлена урезанная версия моего класса настроек и файла xml, которые иллюстрируют проблему. Если пользователь устанавливает Guitar в качестве значения предпочтения с помощью key instrumentList, я бы хотел, чтобы предпочтение с key tuningChoice вернулось к Standard.
//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>
Я могу снова вызвать addPreferencesFromResource в моем методе onSharedPreferenceChanged, который загружает дубликаты всех элементов настроек, отображаемых под старыми элементами, с правильными значениями. Если бы я мог найти способ отменить исходный addPreferencesFromResource, вызываемый во время onCreate, я бы, наверное, установил.
Любая помощь будет оценена, спасибо