将侦听器添加到各个ListPreference项

时间:2011-02-17 16:50:14

标签: android listener android-preferences event-listener

我正在尝试为ListPreference中的项添加单个侦听器,但我找不到合适的代码来执行此操作。

例如,假设我有一个需要设置 region 的应用程序。所以我有一个ListPreference有三个选项;美洲,亚洲,欧洲。

当我使用触控板滚动项目时,我希望他们在获得焦点时说出偏好的文本。

我确信在API的某处我可以为各个项添加一个监听器,但我找不到它。 setOnPreferenceClickListener(..)中有一个ListPreference方法(继承自DialogPreference),但是当您选择实际的父偏好项时。

我是否需要编写一个特殊的子类?

修改

在进一步研究之后,我想我需要进一步澄清我的问题。 使用偏好设置时,您可以覆盖onPreferenceTreeClick (PreferenceScreen prefScreen, Preference pref)中的PreferenceActivity方法。这允许您拦截对首选项的任何点击。但是我想在弹出的实际对话框中添加一个监听器。以上例子中的“美洲,亚洲,欧洲”选项。因此,如果我选择或点击亚洲,我可以拦截它。

所以我的(精炼)问题是如何为这些单独的选项添加一个监听器。

欢呼声

3 个答案:

答案 0 :(得分:8)

final ListPreference list = (ListPreference) preference;
list.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    public boolean onPreferenceChange(Preference preference, Object newValue) {

        int index = list.findIndexOfValue(newValue.toString());

        if (index != -1) {
            Toast.makeText(getBaseContext(), list.getEntries()[index], Toast.LENGTH_LONG).show();
        }
        return true;
    }
});

答案 1 :(得分:2)

在sharedPref值更改后,当persistent = true时调用OnSharedPreferenceChangeListener,但是对于每个项目,您实际上可以分配自己的OnPreferenceChangeListener,并且在那里您可以看到单击了哪个项目

ListPreference pLocAuto = (ListPreference) findPreference(PREF_LOC_AUTO);
pUpdateAuto.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                System.out.print(newValue.toString());
                return false;
            }
        });

答案 2 :(得分:0)

我认为stackoverflow上的另一篇文章与此类似:Custom Row in a ListPreference

在这一个中,子类化是解决方案。但在您的情况下,您可以使用简单的ListAdapter

如果您已设置适配器,则可以使用方法onItemClick并在方法内部使用switch语句(case是数组中的id或索引或类似的东西)调用不同的方法。

我希望我理解你的问题......:)

啊!您还需要查看onFocusChange Listener。您可以将此侦听器添加到每个首选项(必须是视图;您在适配器中添加侦听器),然后在侦听器方法中添加已声明的switch语句。

问候,我希望我可以提供一些提示,

儒略