您可能会遇到问题,因为必须将
flag
声明为最终才能在 OnPreferenceClickListener
内访问。尝试将其封装在一个类中并将该类声明为final。
为了更直接地回答您的问题,请记住,当您从
onPreferenceClick()
返回 true 时,您是在告诉系统“别担心,我已经处理好了。”因此,当您只是返回 true 而没有实际执行任何操作时,系统本身并没有忽略您,您只是告诉它在单击 Preference
时不执行任何操作。
您的代码看起来与此示例的第 108-115 行类似。仔细看看它可能会有所帮助。
在 Preference.performClick 中,它检查 isEnabled() 是否为 true,调用 onClick(),然后调用您的侦听器,如果返回 false,则返回 - 如果不是,则继续处理,并将点击传播到右侧树/屏幕/启动活动指定。
错误在于它在 onPreferenceClick 之前调用 onClick,因此无论 onPreferenceClick 返回什么,例如复选框总是处于切换状态。
解决方法:不幸的是,您需要对所有首选项进行子类化并进行自己的侦听器调度,并且仅在允许的情况下调用 super.onClick()。
我相信您想使用 setOnPreferenceChangeListener 而不是 setOnPreferenceClickListener。根据 android 文档:
这是在 Preference 的状态即将更新之前以及状态被持久化之前调用的。
返回:
如果为 True,则使用新值更新首选项的状态。
示例:
Preference pref = findPreference("pref_key");
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (flag) {
// do some stuff
return false; // Pref change will be not be persisted.
} else {
return true;
}
}
});
我用
getActivity().recreate()
来打断 onClick()
。
...
findPreference("pref_screen_key").setOnPreferenceClickListener(
new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
if (flag) {
// do some stuff
getActivity().recreate()
return true; // According to Android doc it means, that click was handled
} else
return false;
}
或者根据具体情况也可能是
getActivity().onBackPressed()
。