1

我在 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" />
        ....

在 PreferenceActivity 中,我为“pref_screen_key”覆盖了 onPreferenceClick():

     ...
     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?

4

3 回答 3

1

您可能会遇到问题,因为flag必须声明 final 才能在OnPreferenceClickListener. 尝试将其封装在一个类中并声明该类为final。

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

您的代码类似于本示例的第 108-115 行。仔细看看,它可能会有所帮助。

于 2012-06-05T16:34:38.740 回答
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()。

于 2015-09-02T15:46:53.150 回答
0

我相信您想使用 setOnPreferenceChangeListener 而不是 setOnPreferenceClickListener。根据android 文档

这在 Preference 的状态即将更新和状态保持之前被调用。

返回:

True 使用新值更新 Preference 的状态。

例子:

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;
    }
  }
});
于 2016-11-07T02:28:00.453 回答