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

为什么Android会忽略返回true的OnPreferenceClickListener()?,android,preferenceactivity,preferencescreen,Android,Preferenceactivity,Preferencescreen,我在xml文件中定义了我的首选项,如下所示: <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen android:title="@string/pref_screen" android:key="pref_screen_key"> <CheckBoxPreference android:

我在xml文件中定义了我的首选项,如下所示:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
    android:title="@string/pref_screen"
    android:key="pref_screen_key">

    <CheckBoxPreference
        android:defaultValue="true"
        android:key="prefs1_key"
        android:title="@string/prefs1_str"
        android:summary="@string/prefs1_summary" />
        ....
因此,如果我的标志为true,我希望Android不会使用CheckBoxPreference打开视图,而只是执行我的东西(我在onPreferenceClick()中返回true,以指示单击已被处理,不需要执行默认的onPreferenceClick()行为)。 不幸的是,Android总是以默认行为处理onPreferenceClick(),同时制作我的东西

这是安卓系统中的一个bug吗?
有没有办法防止Android在用户单击PreferenceScreen后显示CheckBoxPreference?

您可能会遇到这样的问题:
标志必须声明为final才能在
OnPreferenceClickListener
中访问。尝试将其封装在类中并声明类final

要更直接地回答您的问题,请记住,当您从preferenceclick()返回true时,您告诉系统“别担心,我已经处理好了”。因此,当您只是返回true而没有实际执行任何操作时,系统本身并没有忽略您,您只是告诉它在单击
首选项时不要执行任何操作


您的代码看起来类似于中的第108-115行。仔细看一下,它可能会有所帮助。

您可能会遇到这样的问题:
标志必须声明为final,才能在
OnPreferenceClickListener
中访问。尝试将其封装在类中并声明类final

要更直接地回答您的问题,请记住,当您从preferenceclick()返回true时,您告诉系统“别担心,我已经处理好了”。因此,当您只是返回true而没有实际执行任何操作时,系统本身并没有忽略您,您只是告诉它在单击
首选项时不要执行任何操作

您的代码看起来类似于中的第108-115行。仔细看一下,它可能会有所帮助。

错误已经存在

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

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

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

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

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


解决方法:不幸的是,您需要对所有首选项进行子类化,并执行自己的侦听器分派,如果允许,只调用super.onClick()。

我相信您希望使用setOnPreferenceChangeListener而不是setOnPreferenceClickListener。根据:

在将要更新首选项的状态之前以及在持久化状态之前调用此函数

返回:

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;
    }
  }
});

我相信您希望使用setOnPreferenceChangeListener而不是setOnPreferenceClickListener。根据:

在将要更新首选项的状态之前以及在持久化状态之前调用此函数

返回:

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;
    }
  }
});