我正在构建一个Preference Activity,其中列表中的大多数首选项将执行代码而不直接修改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>
我的目标是在单击其中一个首选项时执行一段代码。类似于&#34;清除搜索历史记录&#34;在Google Play设置首选项菜单中。 (http://i.imgur.com/qnHbJX9.png)
有谁知道如何做到这一点?
我必须补充说我已尝试使用findPreference(&#34; KeyNameHere&#34;)但它总是返回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事件的响应。唯一的缺点是我必须删除首选项分组。任何人都知道这是为什么以及任何解决方法?
答案 0 :(得分:14)
在OnPreferenceClickListener
onPreferenceClick
@Override
public boolean onPreferenceClick (Preference preference)
{
String key = preference.getKey();
// do what ever you want with this key
}
答案 1 :(得分:11)
这可能对OP没有用,但可能对其他人有用。 我想写一些总结;一般来说,您可以主要遵循以下三种方式: 1)您可以使用
在代码中的某处找到您的偏好Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);
然后您可以添加单击侦听器并使用
覆盖其单击方法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。
希望这对某人有用!
答案 2 :(得分:8)
我想出了自己的(我认为真的搞砸了)解决方案;但它确实有效。
for(int x = 0; x < getPreferenceScreen().getPreferenceCount(); x++){
PreferenceCategory lol = (PreferenceCategory) getPreferenceScreen().getPreference(x);
for(int y = 0; y < lol.getPreferenceCount(); y++){
Preference pref = lol.getPreference(y);
pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener(){
@Override
public boolean onPreferenceClick(Preference preference) {
return false;
}
});
}
}
所以我学到的是有一个分层系统,其工作方式如下:PreferenceScreen有子项PreferenceCategory有子项首选项,正如您在XML文件中看到的那样。我的问题是我无法直接从PreferenceScreen设置首选项'onClickListeners。所以我创建了两个for循环,这些循环将分解到每个Preference并为每个Preference设置一个OnPreferenceClickListener。凌乱,但最后工作。
答案 3 :(得分:8)
您还可以找到首选项并设置点击监听器。
Preference connectToNewComputer= findPreference("connectToNewComputer");
connectToNewComputer.setOnPreferenceClickListener(this);
答案 4 :(得分:8)
只需覆盖:
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
String key = preference.getKey();
...
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
答案 5 :(得分:6)
其他答案对我来说在 Androidx 中无效。我从Android Developers指南中实现了设置
请参阅以下有关实现点击侦听器的指南
1)在您的设置片段中实现PreferenceManager.OnPreferenceTreeClickListener,如下面的代码
import androidx.preference.PreferenceManager;
class SettingsFragment extends PreferenceFragmentCompat implements PreferenceManager.OnPreferenceTreeClickListener {
2)覆盖SettingsFragment内的onPreferenceTreeClick
@Override
public boolean onPreferenceTreeClick(Preference preference) {
String key = preference.getKey();
switch (key) {
case "key1":
return true;
case "key2":
return true;
//codes
}
}
答案 6 :(得分:0)
如果您发现以下内容,您的Preference对象将不会为null (来自项目的copypasting):
public class ImePreferences extends PreferenceActivity {
.....
@Override
protected boolean isValidFragment(String fragmentName) {
return Settings.class.getName().equals(fragmentName);
}
.....
public static class Settings extends InputMethodSettingsFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setInputMethodSettingsCategoryTitle(R.string.language_selection_title);
setSubtypeEnablerTitle(R.string.select_language);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.ime_preferences);
Preference pLcl = getPreferenceScreen().findPreference(getResources().getString(
R.string.dictionary_button));
pLcl.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// handle click here
l.a("this is the click");
return true;
}
});
if(pLcl != null)
l.a(6576);
}
}
.....
}