为什么Android会忽略返回true的OnPreferenceClickListener()?
我在xml文件中定义了我的首选项,如下所示:为什么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:
<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;
}
}
});