在我的应用程序中,我想在我的首选项活动中为各个首选项列表项设置一个点击监听器,问题是我只能找到如何在主要listprefernce本身上设置一个点击监听器,有没有办法我可以为各个列表项设置一个键,所以当我设置一个OnPreferenceClickListener时,我可以执行一些列表项特定的代码?
答案 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
}
这适用于我的目的。