Подтвердить что ты не робот

Приоритетная деятельность по предпочтению 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. Единственная нижняя сторона - мне нужно удалить группу предпочтений. Кто-нибудь знает, почему это так и есть способ исправить это?

4b9b3361

Ответ 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);
    }
}

.....

}