我一直在尝试让一个开关首选项在 Android 中工作,从而我可以在某些情况下以不同的方式拦截和处理,当他们打开/关闭它时,或者当他们点击整个首选项时。
这就是我想要完成的事情:用户进入首选项标签已关闭并且没有存储标签(即:标签首选项为空)用户打开标签的首选项,并且由于当前没有存储标签,因此它启动了标签搜索活动供用户查找标签。- 工作正常。
如果标签已经存在,并且它们仅更改状态,则正常更新值。- 工作正常
这是我的问题:如果他们点击了首选项并且他们已经保存了标签,请不要更改状态(无论它是启用还是禁用),启动标签搜索活动。- 这不起作用。
到目前为止,我发现在上面的最后一个场景中,我收到了对 onPreferenceChanged 的调用,然后是对 onPreferenceClicked 的调用,然后是对 onPreferenceChanged 的后续调用。这似乎是我的问题。第一次调用 onPreferenceChanged 导致我的 SharedPreferences 上的侦听器被调用,告诉它它现在已启用。
如果我没有收到对 onPreferenceChanged 的第一次调用,那么我不会有问题。
这是我设置监听器的相关部分
SwitchPreference tagPref = (SwitchPreference) findPreference(PreferencesConstants.PREFERENCE_TAG_ENABLED);
tagPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Log.e("BLAH", "onPrefChanged....is it handled by OnClick?" + Boolean.toString(handledByClick));
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
boolean enabled = prefs.getBoolean(PreferencesConstants.PREFERENCE_TAG_ENABLED, false);
Log.e("BLAH", "value stored in prefs? " + Boolean.toString(enabled));
if (newValue instanceof Boolean) {
enabled = (Boolean) newValue;
}
Log.e("BLAH", "New value? " + Boolean.toString(enabled));
if (!handledByClick) {
if (enabled && (currentTag == null || currentTag.isEmpty())) {
Log.e("BLAH", "Enabled and CurrentTag empty!");
Intent intent = new Intent(getActivity(), TagSearchActivity.class);
startActivityForResult(intent, 0);
return false; // always return false, we'll handle
// updating
// this value manually.
} else {
return true;
}
}
Log.e("BLAH", "returning false (AS IN WE HANDLED IT).");
return false;
}
});
tagPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
handledByClick = true;
Log.e("BLAH", "onprefClick");
Intent intent = new Intent(getActivity(), TagSearchActivity.class);
startActivityForResult(intent, 0);
return true;
}
});
以下是使用保存的标签运行它并单击首选项后的相关日志行。
01-18 15:55:05.593: E/BLAH(13261): onPrefChanged....is it handled by OnClick?false
01-18 15:55:05.593: E/BLAH(13261): value stored in prefs? true
01-18 15:55:05.593: E/BLAH(13261): New value? false
01-18 15:55:05.613: E/DifferentClass(13261): On Shared Preferences Changed - tagEnabled
01-18 15:55:05.652: E/DifferentClass(13261): disabled TAG in cancelAlarmService
01-18 15:55:05.662: E/AnotherClass(13261): Updating Feed List. Old Size: 33, New Size: 14
01-18 15:55:05.682: E/BLAH(13261): onprefClick
01-18 15:55:05.812: E/BLAH(13261): onPrefChanged....is it handled by OnClick?true
01-18 15:55:05.812: E/BLAH(13261): value stored in prefs? false
01-18 15:55:05.822: E/BLAH(13261): New value? false
01-18 15:55:05.822: E/BLAH(13261): returning false (AS IN WE HANDLED IT).