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

vulvrdjw  于 2024-01-04  发布在  Android
关注(0)|答案(4)|浏览(148)

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

  1. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
  2. <PreferenceScreen
  3. android:title="@string/pref_screen"
  4. android:key="pref_screen_key">
  5. <CheckBoxPreference
  6. android:defaultValue="true"
  7. android:key="prefs1_key"
  8. android:title="@string/prefs1_str"
  9. android:summary="@string/prefs1_summary" />
  10. ....

字符串
在PreferenceActivity中,我覆盖了onPreferenceClick()的“屏幕键”:

  1. ...
  2. findPreference("pref_screen_key").setOnPreferenceClickListener(
  3. new OnPreferenceClickListener() {
  4. @Override
  5. public boolean onPreferenceClick(Preference preference) {
  6. if (flag) {
  7. // do some stuff
  8. return true; // According to Android doc it means, that click was handled
  9. } else
  10. return false;
  11. }


因此,如果我的标志为true,我希望Android不会使用CheckBoxPreference打开视图,而只是执行我的内容(我在onPreferenceClick()中返回true,以指示单击已被处理,并且不需要执行默认的onPreferenceClick()行为)。不幸的是,Android总是使用默认行为处理onPreferenceClick(),同时生成我的内容。
这是Android中的一个bug吗?有没有方法可以防止Android在用户点击PreferenceScreen后显示CheckBoxPreference?

2izufjch

2izufjch1#

您可能遇到了这样的问题,即必须将flag声明为final才能在OnPreferenceClickListener内部访问。请尝试将其封装在一个类中并将该类声明为final。
为了更直接地回答你的问题,请记住,当你从onPreferenceClick()返回true时,你告诉系统“别担心,我已经处理好了”。所以,当你只是返回true而没有实际做任何事情时,系统并没有忽略你,本质上,你只是告诉它在点击Preference时什么都不做。
您的代码看起来与this example的第108-115行类似,仔细查看可能会有所帮助。

9wbgstp7

9wbgstp72#

错误在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则返回-如果不是,则继续处理,并将单击传播到指定的右树/屏幕/启动Activity。
问题是它在onPreferenceClick之前调用onClick,所以无论onPreferenceClick返回什么,复选框总是被切换。
解决办法:不幸的是,您需要继承所有首选项,并执行自己的侦听器调度,并且仅在允许的情况下调用super.onClick()。

zpjtge22

zpjtge223#

我相信你想使用setOnPreferenceChangeReader而不是setOnPreferenceClickReader。根据android docs
这是在Preference的状态即将被更新之前和状态被持久化之前调用的。
返回:
则使用新值更新首选项的状态。
范例:

  1. Preference pref = findPreference("pref_key");
  2. pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
  3. @Override
  4. public boolean onPreferenceChange(Preference preference, Object newValue) {
  5. if (flag) {
  6. // do some stuff
  7. return false; // Pref change will be not be persisted.
  8. } else {
  9. return true;
  10. }
  11. }
  12. });

字符串

展开查看全部
qnyhuwrf

qnyhuwrf4#

我使用getActivity().recreate()来中断onClick()

  1. ...
  2. findPreference("pref_screen_key").setOnPreferenceClickListener(
  3. new OnPreferenceClickListener() {
  4. @Override
  5. public boolean onPreferenceClick(Preference preference) {
  6. if (flag) {
  7. // do some stuff
  8. getActivity().recreate()
  9. return true; // According to Android doc it means, that click was handled
  10. } else
  11. return false;
  12. }

字符串
也可以是getActivity().onBackPressed()getActivity().finish(),这取决于具体情况。

展开查看全部

相关问题