我遇到onSharedPreferenceChanged的问题仅在MultiSelectListPreference发生更改时才第一次调用。我打开我的设置活动并更改工作正常的值,并调用onSharedPreferenceChanged。如果我再次打开对话框,则会显示所选的正确条目。我选择另一个条目并点击OK。现在应该调用onSharedPreferenceChanged但不是。如果我现在再次打开对话框,则不会选择任何条目。我错过了什么或者我做错了吗?
这是我的偏好.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<MultiSelectListPreference
android:key="operations"
android:title="@string/pref_operations"
android:dialogTitle="@string/pref_operations"
android:entries="@array/pref_operations_entries"
android:entryValues="@array/pref_operations_values"
android:defaultValue="@array/pref_operations_default" />
</PreferenceScreen>
我的设置片段
public class SettingsFragment extends PreferenceFragment
implements SharedPreferences.OnSharedPreferenceChangeListener
{
public static final String KEY_OPERATIONS_PREFERENCE = "operations";
private MultiSelectListPreference operationsPreference;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
operationsPreference = (MultiSelectListPreference) getPreferenceScreen().findPreference(KEY_OPERATIONS_PREFERENCE);
}
@Override
public void onResume()
{
super.onResume();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
Set<String> operations = operationsPreference.getValues();
String summary = "";
for (String s : operations)
summary += s + " ";
operationsPreference.setSummary(summary);
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause()
{
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
if (key.equals(KEY_OPERATIONS_PREFERENCE))
{
Set<String> operations = operationsPreference.getValues();
String summary = "";
for (String s : operations)
summary += s + " ";
operationsPreference.setSummary(summary);
}
}
}
答案 0 :(得分:0)
嗯,坦率地说,我以不同的方式构建了我的sharedPreferances ...附上我的代码示例,希望它对你有用 在这里:
这是共享偏好类
public class AppPreferences {
public static final String KEY_LANG = "language";
final String APP_SHARED_PREFS = AppPreferences.class.getSimpleName(); // Name
// of
// the
// file
// -.xml
private SharedPreferences _sharedPrefs;
private Editor _prefsEditor;
public AppPreferences(Context context) {
this._sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS,
Activity.MODE_PRIVATE);
this._prefsEditor = _sharedPrefs.edit();
}
public String getlanguage() {
return _sharedPrefs.getString(KEY_LANG, "");
}
public void savelanguage(String text) {
_prefsEditor.putString(KEY_LANG, text);
_prefsEditor.commit();
}
}
使用它你需要创建 在你的班级
private AppPreferences _appPrefs;
以及使用的示例是
_appPrefs = new AppPreferences(getApplicationContext());
_appPrefs.savelanguage("English");
language = _appPrefs.getlanguage();
这就是我建造它的方式......就像一个魅力......并且根本不复杂
答案 1 :(得分:0)
这是因为您在onPause回调方法中取消注册侦听器,该方法在Activity中显示Dialog时调用。