Приоритетная деятельность по предпочтению Click Listener
Я создаю функцию предпочтения, в которой большинство предпочтений в списке будет выполнять код и не изменять SharedPreference напрямую. Мой файл preferences.xml выглядит следующим образом.
<PreferenceCategory
android:title="Connection" >
<Preference
android:id="@+id/settings_connectToNewComputer"
android:key="connectToNewComputer"
android:summary="Currently connected to:"
android:title="Connect to new computer" />
<Preference
android:id="@+id/removeDevice"
android:key="removeDevice"
android:summary="Remove this device from the computer whitelist"
android:title="Remove this device from computer" />
</PreferenceCategory>
<PreferenceCategory
android:title="About" >
<Preference
android:id="@+id/settings_About"
android:key="about"
android:summary="About me and my thanks to those who made this app great"
android:title="About Hue Pro" />
<Preference
android:id="@+id/contact"
android:key="contact"
android:summary="Contact me with comments, bugs, and suggestions for updates"
android:title="Contact me" />
</PreferenceCategory>
Моя цель - создать блок кода, когда будет нажата одна из этих настроек. Аналогично "Очистить историю поиска" в меню настроек настроек Google Play. (http://i.imgur.com/qnHbJX9.png)
Кто-нибудь знает, как сделать это возможным?
Мне нужно добавить, что я попытался использовать findPreference ( "KeyNameHere" ), но он всегда возвращает null.
Спасибо!
Edit:
Я добавил в этот код и реализовал OnPreferenceClickListener:
@Override
public boolean onPreferenceClick(Preference preference) {
return false;
}
Но этот метод никогда не вызывается. Есть ли другой способ сделать это?
Изменить 2:
Я обнаружил, что если я вытащил теги PreferenceCategory, то я останусь с этим:
<Preference
android:id="@+id/settings_connectToNewComputer"
android:key="connectToNewComputer"
android:summary="Currently connected to:"
android:title="Connect to new computer" />
<Preference
android:id="@+id/removeDevice"
android:key="removeDevice"
android:summary="Remove this device from the computer whitelist"
android:title="Remove this device from computer" />
<Preference
android:id="@+id/settings_About"
android:key="about"
android:summary="About me and my thanks to those who made this app great"
android:title="About Hue Pro" />
<Preference
android:id="@+id/contact"
android:key="contact"
android:summary="Contact me with comments, bugs, and suggestions for updates"
android:title="Contact me" />
и назовите это:
getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
return false;
}
});
тогда я получаю ответ от события click. Единственная нижняя сторона - мне нужно удалить группу предпочтений. Кто-нибудь знает, почему это так и есть способ исправить это?
Ответы
Ответ 1
Я придумал свое собственное (что, я считаю, действительно испорченное) решение; но он работает.
for(int x = 0; x < getPreferenceScreen().getPreferenceCount(); x++){
PreferenceCategory lol = (PreferenceCategory) getPreferenceScreen().getPreference(x);
for(int y = 0; y < lol.getPreferenceCount(); y++){
Preference pref = lol.getPreference(y);
pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener(){
@Override
public boolean onPreferenceClick(Preference preference) {
return false;
}
});
}
}
Итак, я узнал, что существует иерархическая система, которая работает так: PreferenceScreen имеет детей. PreferenceCategory имеет дочерние предпочтения, как вы можете видеть в XML файле. Моя проблема заключалась в том, что я не мог установить настройки onClickListeners непосредственно из PreferenceScreen. Таким образом, я сделал два цикла, которые перейдут к каждой Предпочтения и установят OnPreferenceClickListener для каждого из них. Беспощадно, но работает наконец.
Ответ 2
Внесите OnPreferenceClickListener
и в onPreferenceClick
@Override
public boolean onPreferenceClick (Preference preference)
{
String key = preference.getKey();
// do what ever you want with this key
}
Ответ 3
Вы также можете найти предпочтение и установить прослушиватель кликов.
Preference connectToNewComputer= findPreference("connectToNewComputer");
connectToNewComputer.setOnPreferenceClickListener(this);
Ответ 4
Возможно, это не может быть полезно для OP, но может быть полезно для кого-то другого.
Я хотел бы написать своего рода резюме; в общем, вы можете следовать главным образом тремя способами:
1) вы можете найти свое предпочтение где-то в своем коде с помощью
Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);
а затем вы можете добавить прослушиватель кликов и переопределить метод on-click с помощью
examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// handle click here
}
});
Это нужно сделать для всех предпочтений, клики которых вы хотите прослушать
2) Вы можете реализовать интерфейс Preference.OnPreferenceClickListener в ваших настройках фрагмента/активности и переопределить onPreferenceClick только один раз, используя конструкцию коммутатора или конструкцию if-else if-else if -... и объединив все отдельные дескрипторы; это должно быть что-то вроде:
@Override
public boolean onPreferenceClick(Preference preference) {
switch (preference.getKey()) {
case KEY_EXAMPLE_PREFERENCE: {
// handle click here
}
break;
case ...
}
}
Затем вам все равно нужно найти каждое предпочтение, но вы можете просто вызвать каждый из них
setOnPreferenceClickListener(this);
(Я думаю, что реализация OP не сработала (его метод не был вызван) из-за этой последней части)
мы передаем "this" как параметр, потому что мы реализовали интерфейс прослушивателя кликов
3) (который я считаю самым простым), вы можете переопределить
onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
в вашем фрагменте/активности предпочтений без реализации какого-либо другого интерфейса, и там вы можете скопировать переключатель if-else if -... конструкции варианта 2); главное преимущество в том, что вам не нужно искать все предпочтения и называть их setOnPreferenceClickListener.
Надеюсь, что это будет полезно для кого-то!
Ответ 5
Просто переопределить:
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
String key = preference.getKey();
...
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
Ответ 6
Ваш объект Preference не получит значение null, если вы найдете следующие
(копирование из проекта):
public class ImePreferences extends PreferenceActivity {
.....
@Override
protected boolean isValidFragment(String fragmentName) {
return Settings.class.getName().equals(fragmentName);
}
.....
public static class Settings extends InputMethodSettingsFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setInputMethodSettingsCategoryTitle(R.string.language_selection_title);
setSubtypeEnablerTitle(R.string.select_language);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.ime_preferences);
Preference pLcl = getPreferenceScreen().findPreference(getResources().getString(
R.string.dictionary_button));
pLcl.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// handle click here
l.a("this is the click");
return true;
}
});
if(pLcl != null)
l.a(6576);
}
}
.....
}