首选项上的首选项活动单击"侦听器"

Bar*_*ick 15 android preferenceactivity onclicklistener

我正在构建一个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>
Run Code Online (Sandbox Code Playgroud)

我的目标是在单击其中一个首选项时执行一段代码.与Google Play设置首选项菜单中的"清除搜索记录"类似.(http://i.imgur.com/qnHbJX9.png)

有谁知道如何使这成为可能?

我必须补充一点,我尝试使用findPreference("KeyNameHere"),但它总是返回null.

谢谢!


编辑:

我在此代码中添加并实现了OnPreferenceClickListener:

@Override
public boolean onPreferenceClick(Preference preference) {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但这种方法永远不会被调用.还有另一种方法吗?


编辑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" />
Run Code Online (Sandbox Code Playgroud)

并称之为:

getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

        @Override
        public boolean onPreferenceClick(Preference preference) {
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

然后我实际上从click事件中得到了响应.唯一的缺点是我必须删除首选项分组.任何人都知道为什么这是和任何方法来解决它?

Hoa*_*yen 15

实施OnPreferenceClickListener和实施onPreferenceClick

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

  • 根据你的编辑,我明白了你的意思.好的,我试过这个.我将implements onPreferenceClickListener添加到我的类中,并实现并覆盖onPreferenceClick(Preference arg0)上的方法.但是当我点击任何偏好时,这种方法永远不会被调用.我不知道为什么...... (7认同)

bd9*_*d95 13

也许这对OP来说无用,但可能对其他人有用.我想写一些总结; 一般来说,您可以主要遵循以下三种方式:1)您可以在代码中的某处找到您的偏好

Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);
Run Code Online (Sandbox Code Playgroud)

然后你可以添加一个点击监听器并覆盖它的on click方法

examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
        // handle click here
    }
});
Run Code Online (Sandbox Code Playgroud)

必须为要监听其点击的每个首选项执行此操作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 ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,你仍然需要找到每个偏好,但你可以简单地调用每个偏好

setOnPreferenceClickListener(this);
Run Code Online (Sandbox Code Playgroud)

(我认为OP的实现不起作用(他的方法没有被调用)因为这最后一部分)我们将"this"作为参数传递,因为我们实现了单击侦听器接口

3)(我认为这是最简单的)你可以覆盖

onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
Run Code Online (Sandbox Code Playgroud)

在你的偏好片段/活动中没有实现任何其他接口,你可以复制选项2)的if-else if -...构造的开关; 主要的优点是你不需要找到每个首选项并调用它们setOnPreferenceClickListener.

希望这对某人有用!


mar*_*mor 10

只是覆盖:

@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {

    String key = preference.getKey();
    ...

    return super.onPreferenceTreeClick(preferenceScreen, preference);
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*ick 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;
                }

            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以我学到的是有一个分层系统,其工作方式如下:PreferenceScreen有子项PreferenceCategory有子项首选项,正如您在XML文件中看到的那样.我的问题是我无法直接从PreferenceScreen设置首选项'onClickListeners.所以我创建了两个for循环,这些循环将分解到每个Preference并为每个Preference设置一个OnPreferenceClickListener.凌乱,但最后工作.

  • +1您的解决方案暗示了我在我的应用中选择的内容.我创建一个`String`数组的键,然后为每个键获得'Preference`并设置`onPreferenceClick`.这是几行代码.谢谢. (2认同)

小智 8

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

Preference connectToNewComputer= findPreference("connectToNewComputer");
connectToNewComputer.setOnPreferenceClickListener(this);
Run Code Online (Sandbox Code Playgroud)


maj*_*han 7

适用于 2020 年 2 月的 Androidx

其他答案对我来说在Androidx不起作用。我从Android 开发者指南中实现了设置

请参阅以下实施点击侦听器的指南

1)在您的设置片段中实现PreferenceManager.OnPreferenceTreeClickListener,如下面的代码

import androidx.preference.PreferenceManager;

class SettingsFragment extends PreferenceFragmentCompat implements PreferenceManager.OnPreferenceTreeClickListener {
Run Code Online (Sandbox Code Playgroud)

2) 在 SettingsFragment 中覆盖 onPreferenceTreeClick

@Override
public boolean onPreferenceTreeClick(Preference preference) {        
    String key = preference.getKey();

        switch (key) {
            case "key1":
                return true;

            case "key2":
                return true;

            //codes    
        }
}
Run Code Online (Sandbox Code Playgroud)

  • 最近我发现我的偏好不再起作用了。花了很多时间才发现 - onPreferenceClick 不再被调用,只有重写 onPreferenceTreeClick 才有帮助。 (2认同)