我在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" />
....
Inside PreferenceActivity我覆盖onPreferenceClick()为“pref_screen_key”:
...
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?
答案 0 :(得分:1)
您可能遇到的问题是flag
必须被声明为最终才能在OnPreferenceClickListener
内访问。尝试将其封装在一个类中并声明类final。
要更直接地回答您的问题,请记住,当您从onPreferenceClick()
返回true时,您告诉系统“不要担心,我会处理它”。所以,当你只是在没有实际做任何事情的情况下返回true时,系统不会忽略你,你只是告诉它在点击Preference
时什么都不做。
您的代码类似于this example的第108-115行。仔细看看它可能有所帮助。
答案 1 :(得分:0)
在Preference.performClick中,它检查isEnabled()是否为true,调用onClick(),然后调用侦听器,如果返回false则返回false - 如果不是,则继续处理,并将单击传播到右侧树/ screen / start指定的活动。
错误是它在onPreferenceClick之前调用onClick,因此无论你的onPreferenceClick返回什么,总是切换复选框。
解决方法:遗憾的是,您需要子类化所有首选项并执行自己的侦听器调度,并且只有在允许的情况下才调用super.onClick()。
答案 2 :(得分:0)
我相信你想使用setOnPreferenceChangeListener而不是setOnPreferenceClickListener。根据{{3}}:
在首选项的状态即将更新之前以及状态持久化之前调用此方法。
返回:
为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;
}
}
});