首选项点击监听器上的首选项活动

问题描述 投票:16回答:7

我正在建立一个首选项活动,其中列表中的大多数首选项将执行代码,而不是直接修改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事件的响应。唯一的缺点是我必须删除首选项分组。任何人都知道为什么会这样,并且有任何解决方法吗?

android onclicklistener preferenceactivity
7个回答
15
投票

实施OnPreferenceClickListeneronPreferenceClick中的

@Override
public boolean onPreferenceClick (Preference preference)
{
    String key = preference.getKey();
    // do what ever you want with this key
}

14
投票

也许这对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。

希望这对某人有用!


10
投票

仅覆盖:


8
投票

我想出了自己的解决方案(我认为确实很糟);但是有效。


8
投票

您还可以找到首选项并设置点击侦听器。


0
投票

您的首选项对象将不会为空,如果您发现以下内容(从项目复制):


0
投票

对于2020年2月的Androidx

© www.soinside.com 2019 - 2024. All rights reserved.