3

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

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

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

我确定在 API 的某个地方我可以为单个项目添加一个侦听器,但我就是找不到它。(inherited from ) 中有一个setOnPreferenceClickListener(..)方法,但这是在您选择实际的父首选项时使用的。ListPreferenceDialogPreference

我需要写一个特殊的子类吗?

编辑

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

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

干杯

4

3 回答 3

9
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;
    }
});
于 2014-07-27T21:15:23.790 回答
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;
            }
        });
于 2012-08-07T11:56:40.833 回答
0

我认为在 stackoverflow 上还有另一篇与此类似的帖子:Custom Row in a ListPreference

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

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

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

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

问候,我希望我能给你一个提示,

朱利安

于 2011-02-17T17:18:24.493 回答