为什么Android会忽略返回true的OnPreferenceClickListener()?

问题描述 投票:0回答:4
android preferenceactivity preferencescreen
4个回答
1
投票

您可能会遇到问题,因为必须将

flag
声明为最终才能在
OnPreferenceClickListener
内访问。尝试将其封装在一个类中并将该类声明为final。

为了更直接地回答您的问题,请记住,当您从

onPreferenceClick()
返回 true 时,您是在告诉系统“别担心,我已经处理好了。”因此,当您只是返回 true 而没有实际执行任何操作时,系统本身并没有忽略您,您只是告诉它在单击
Preference
时不执行任何操作。

您的代码看起来与此示例的第 108-115 行类似。仔细看看它可能会有所帮助。


0
投票

该错误位于 https://github.com/android/platform_frameworks_base/blob/android-5.1.1_r13/core/java/android/preference/Preference.java#L985

在 Preference.performClick 中,它检查 isEnabled() 是否为 true,调用 onClick(),然后调用您的侦听器,如果返回 false,则返回 - 如果不是,则继续处理,并将点击传播到右侧树/屏幕/启动活动指定。

错误在于它在 onPreferenceClick 之前调用 onClick,因此无论 onPreferenceClick 返回什么,例如复选框总是处于切换状态。

解决方法:不幸的是,您需要对所有首选项进行子类化并进行自己的侦听器调度,并且仅在允许的情况下调用 super.onClick()。


0
投票

我相信您想使用 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;
    }
  }
});

0
投票

我用

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()

© www.soinside.com 2019 - 2024. All rights reserved.