我正在建立一个首选项活动,其中列表中的大多数首选项将执行代码,而不是直接修改SharedPreference。我的preferences.xml文件如下所示。
<PreferenceCategory
android:title="Connection" >
<Preference
android:id="@+id/settings_connectToNewComputer"
android:key="connectToNewComputer"
android:summary="Currently connected to:"
android:title="Connect to new computer" />
<Preference
android:id="@+id/removeDevice"
android:key="removeDevice"
android:summary="Remove this device from the computer's whitelist"
android:title="Remove this device from computer" />
</PreferenceCategory>
<PreferenceCategory
android:title="About" >
<Preference
android:id="@+id/settings_About"
android:key="about"
android:summary="About me and my thanks to those who made this app great"
android:title="About Hue Pro" />
<Preference
android:id="@+id/contact"
android:key="contact"
android:summary="Contact me with comments, bugs, and suggestions for updates"
android:title="Contact me" />
</PreferenceCategory>
我的目标是单击这些首选项之一时执行一段代码。类似于Google Play设置首选项菜单中的“清除搜索历史记录”。 (http://i.imgur.com/qnHbJX9.png)
有人知道如何做到这一点吗?
我必须补充一点,我尝试使用findPreference(“ KeyNameHere”),但它始终返回null。
谢谢!
编辑:
我在此代码中添加并实现了OnPreferenceClickListener:
@Override
public boolean onPreferenceClick(Preference preference) {
return false;
}
但是此方法永远不会被调用。还有另一种方法吗?
编辑2:
[我发现,如果我删除了PreferenceCategory标签,那么就剩下这个了:
<Preference
android:id="@+id/settings_connectToNewComputer"
android:key="connectToNewComputer"
android:summary="Currently connected to:"
android:title="Connect to new computer" />
<Preference
android:id="@+id/removeDevice"
android:key="removeDevice"
android:summary="Remove this device from the computer's whitelist"
android:title="Remove this device from computer" />
<Preference
android:id="@+id/settings_About"
android:key="about"
android:summary="About me and my thanks to those who made this app great"
android:title="About Hue Pro" />
<Preference
android:id="@+id/contact"
android:key="contact"
android:summary="Contact me with comments, bugs, and suggestions for updates"
android:title="Contact me" />
并称呼此:
getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
return false;
}
});
然后,我实际上收到了click事件的响应。唯一的缺点是我必须删除首选项分组。任何人都知道为什么会这样,并且有任何解决方法吗?
实施OnPreferenceClickListener
和onPreferenceClick
中的
@Override
public boolean onPreferenceClick (Preference preference)
{
String key = preference.getKey();
// do what ever you want with this key
}
也许这对OP可能没有用,但对其他人可能有用。我想写一篇总结;通常,您可以遵循以下三种主要方法:1)您可以在代码中的某个位置找到您的偏好设置,]
Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);
然后您可以添加一个Click侦听器,并使用]覆盖其on click方法。
examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { // handle click here } });
必须针对您要听其点击的每个首选项进行此操作2)您可以在设置片段/活动中实现Preference.OnPreferenceClickListener接口,并通过使用switch构造或if-else if-else if -...构造并合并所有单个处理,仅重写onPreferenceClick一次;它应该是这样的:
@Override public boolean onPreferenceClick(Preference preference) { switch (preference.getKey()) { case KEY_EXAMPLE_PREFERENCE: { // handle click here } break; case ... } }
然后,您仍然必须找到每个首选项,但是您可以简单地调用每个首选项
setOnPreferenceClickListener(this);
(由于最后一部分,我认为OP的实现不起作用(未调用他的方法))我们通过传递“ this”作为参数,因为我们实现了点击监听器界面
3)(我认为这是最简单的),您可以覆盖
onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
在您偏好的片段/活动中,无需实现任何其他接口,您可以在其中复制选项2的if-else if -...构造的开关);主要优点在于您无需查找每个首选项并调用它们setOnPreferenceClickListener。
希望这对某人有用!
仅覆盖:
我想出了自己的解决方案(我认为确实很糟);但是有效。
您还可以找到首选项并设置点击侦听器。
您的首选项对象将不会为空,如果您发现以下内容(从项目复制):