我在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中,我覆盖了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;
}
型
因此,如果我的标志为true,我希望Android不会使用CheckBoxPreference打开视图,而只是执行我的内容(我在onPreferenceClick()中返回true,以指示单击已被处理,并且不需要执行默认的onPreferenceClick()行为)。不幸的是,Android总是使用默认行为处理onPreferenceClick(),同时生成我的内容。
这是Android中的一个bug吗?有没有方法可以防止Android在用户点击PreferenceScreen后显示CheckBoxPreference?
4条答案
按热度按时间2izufjch1#
您可能遇到了这样的问题,即必须将
flag
声明为final才能在OnPreferenceClickListener
内部访问。请尝试将其封装在一个类中并将该类声明为final。为了更直接地回答你的问题,请记住,当你从
onPreferenceClick()
返回true时,你告诉系统“别担心,我已经处理好了”。所以,当你只是返回true而没有实际做任何事情时,系统并没有忽略你,本质上,你只是告诉它在点击Preference
时什么都不做。您的代码看起来与this example的第108-115行类似,仔细查看可能会有所帮助。
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()。
zpjtge223#
我相信你想使用setOnPreferenceChangeReader而不是setOnPreferenceClickReader。根据android docs:
这是在Preference的状态即将被更新之前和状态被持久化之前调用的。
返回:
则使用新值更新首选项的状态。
范例:
字符串
qnyhuwrf4#
我使用
getActivity().recreate()
来中断onClick()
。字符串
也可以是
getActivity().onBackPressed()
或getActivity().finish()
,这取决于具体情况。