如何在android中的各个listpreference项上设置一个点击监听器?

时间:2012-05-01 02:25:17

标签: android android-preferences

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

2 个答案:

答案 0 :(得分:1)

确保您的首选项类implements OnPreferenceClickListener然后覆盖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;
}

答案 1 :(得分: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
    }

这适用于我的目的。