0

在我的应用程序中,我想在我的首选项活动中的各个首选项列表项目上设置一个点击监听器,问题是我只能找出如何在主列表首选项本身上设置一个点击监听器,有没有办法可以设置单个列表项的键,所以当我设置 OnPreferenceClickListener 时,我可以执行一些列表项特定的代码?

4

2 回答 2

1

确保您的首选项类implementsOnPreferenceClickListener 然后覆盖onPreferenceClick然后检查按下了哪个首选项键

@Override
public boolean onPreferenceClick(Preference preference) {
    if (preference.getKey().equals("schedulestart")) {
        showDialog(0);
    } else if (preference.getKey().equals("schedulestop")) {
        showDialog(1);
    } else if (preference.getKey().equals("priority")) {

        getPreferenceManager().getSharedPreferences().edit().putInt("unreadcount", 0).commit();
    }
    return true;
}
于 2012-05-01T02:29:09.050 回答
1

这个问题相对来说比较古老,但我想做类似的事情——特别是在点击任何 ListPreference 项目时加入钩子。onSharedPreferenceChanged 之类的东西对我不起作用,因为即使单击了当前选择的 ListPreference,我也需要做一些事情。我不确定我是否理解这里的另一个答案来解决问题。我的谷歌搜索没有发现任何其他解决方案。

我继续扩展 ListPreference 并覆盖 onDialogClosed()。onDialogClosed 的 ListPreference 源代码是

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);

        if (positiveResult && mClickedDialogEntryIndex >= 0 && mEntryValues != null) {
            String value = mEntryValues[mClickedDialogEntryIndex].toString();
            if (callChangeListener(value)) {
                setValue(value);
            }
        }
    }

我创建了一个工作界面来在我的新 ListPreference 中发送所选列表项的值,然后覆盖 onDialogClosed:

public class MyListPreference extends ListPreference {

    private ListItemClickListener mListItemClickListener;

...

    public void setOnListItemClickListener(ListItemClickListener listener) {
        mListItemClickListener = listener;
    }

    public interface ListItemClickListener {
        public void onListItemClick(String value);
    }
...

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);

        if (positiveResult && getEntryValues() != null && mListItemClickListener != null) {
            String value = getValue();
            mListItemClickListener.onListItemClick(value);
        }
    }

然后,在您的设置活动中(或您使用新 ListPreference 的任何地方),只需将其挂钩:

    @Override
    protected void onResume() {
        super.onResume();

        MyListPreference listPref = (MyListPreference)
                findPreference(getString(R.string.key_name));
        listPref.setOnListItemClickListener(this);    
    }

    ...
    public void onListItemClick(String value) { 
    // Do something
    }

这适用于我的目的。

于 2015-06-22T22:59:10.677 回答