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

时间:2012-06-05 16:21:40

标签: 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:defaultValue="true"
        android:key="prefs1_key"
        android:title="@string/prefs1_str"
        android:summary="@string/prefs1_summary" />
        ....

Inside PreferenceActivity我覆盖onPreferenceClick()为“pref_screen_key”:

     ...
     findPreference("pref_screen_key").setOnPreferenceClickListener(
     new OnPreferenceClickListener() {

     @Override
     public boolean onPreferenceClick(Preference preference) {
         if (flag) {
              // do some stuff
              return true; // According to Android doc it means, that click was handled
          } else
              return false;
     }

所以我希望如果我的标志为真,Android不会打开带CheckBoxPreference的视图,而只是执行我的东西(我在onPreferenceClick()中返回true表示点击已被处理,并且不需要执行默认的onPreferenceClick ()行为)。 不幸的是,Android总是使用默认行为处理onPreferenceClick()并同时生成我的东西。

这是Android中的错误吗? 有没有办法阻止Android在用户点击PreferenceScreen后显示CheckBoxPreference?

3 个答案:

答案 0 :(得分:1)

您可能遇到的问题是flag必须被声明为最终才能在OnPreferenceClickListener内访问。尝试将其封装在一个类中并声明类final。

要更直接地回答您的问题,请记住,当您从onPreferenceClick()返回true时,您告诉系统“不要担心,我会处理它”。所以,当你只是在没有实际做任何事情的情况下返回true时,系统不会忽略你,你只是告诉它在点击Preference时什么都不做。

您的代码类似于this example的第108-115行。仔细看看它可能有所帮助。

答案 1 :(得分: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则返回false - 如果不是,则继续处理,并将单击传播到右侧树/ screen / start指定的活动。

错误是它在onPreferenceClick之前调用onClick,因此无论你的onPreferenceClick返回什么,总是切换复选框。

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

答案 2 :(得分:0)

我相信你想使用setOnPreferenceChangeListener而不是setOnPreferenceClickListener。根据{{​​3}}:

  

在首选项的状态即将更新之前以及状态持久化之前调用此方法。

返回:

  

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