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

时间:2013-03-20 23:44:49

标签: android onclicklistener preferenceactivity

我正在构建一个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事件的响应。唯一的缺点是我必须删除首选项分组。任何人都知道这是为什么以及任何解决方法?

7 个答案:

答案 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)

适用于2020年2月的Androidx

其他答案对我来说在 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);
    }
}

.....

}