【问题标题】:Why does Android ignore OnPreferenceClickListener() that returns true?为什么 Android 会忽略返回 true 的 OnPreferenceClickListener()?
【发布时间】:2016-11-07 10:28:00
【问题描述】:

我在 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?

【问题讨论】:

    标签: android preferenceactivity preferencescreen


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      错误在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()。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-08
          • 1970-01-01
          • 1970-01-01
          • 2018-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多