Добавление слушателей к отдельным элементам ListPreference - PullRequest
2 голосов
/ 17 февраля 2011

Я пытаюсь добавить отдельных слушателей к элементам в ListPreference, но я просто не могу найти правильный код для этого.

Например, предположим, у меня есть приложение, для которого нужно установить регион . Итак, у меня есть ListPreference с тремя вариантами; Америка, Азия, Европа.

Когда я использую трекпад для прокрутки пунктов, я бы хотел, чтобы они произносили текст предпочтения, когда они получают фокус.

Я уверен, что где-то в API я могу добавить слушателя для отдельных элементов, но я просто не могу его найти. В ListPreference есть метод setOnPreferenceClickListener(..) (унаследованный от DialogPreference), но он предназначен для выбора фактического родительского элемента предпочтения.

Нужно ли писать специальный подкласс?

EDIT

После более подробного изучения я думаю, что мне нужно уточнить мой вопрос. При использовании настроек вы можете переопределить метод onPreferenceTreeClick (PreferenceScreen prefScreen, Preference pref) в PreferenceActivity. Это позволяет вам перехватывать любые клики по настройкам. Однако я хочу добавить слушателя к самому всплывающему диалоговому окну. Варианты «Америка, Азия, Европа» из приведенного выше примера. Поэтому, если я выберу или нажму на Азию, я могу перехватить ее.

Поэтому мой (уточненный) вопрос заключается в том, как добавить слушателя к этим индивидуальным параметрам.

ура

Ответы [ 3 ]

8 голосов
/ 28 июля 2014
final ListPreference list = (ListPreference) preference;
list.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    public boolean onPreferenceChange(Preference preference, Object newValue) {

        int index = list.findIndexOfValue(newValue.toString());

        if (index != -1) {
            Toast.makeText(getBaseContext(), list.getEntries()[index], Toast.LENGTH_LONG).show();
        }
        return true;
    }
});
2 голосов
/ 07 августа 2012

OnSharedPreferenceChangeListener вызывается, когда persistent = true после изменения значения sharedPref, но для каждого элемента вы можете фактически назначить свой собственный OnPreferenceChangeListener, и там вы видите, какой элемент был нажат

ListPreference pLocAuto = (ListPreference) findPreference(PREF_LOC_AUTO);
pUpdateAuto.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                System.out.print(newValue.toString());
                return false;
            }
        });
0 голосов
/ 17 февраля 2011

Я думаю, что есть еще один пост в стеке потока, похожий на этот: Пользовательская строка в ListPreference .

В этом подклассификация является решением. Но может быть в вашем случае вы можете использовать простой ListAdapter.

Если вы настроили адаптер, вы можете использовать метод onItemClick, а внутри метода вы можете использовать оператор switch (case - это идентификатор или индекс в массиве или что-то подобное), чтобы вызывать разные методы.

Надеюсь, я понял ваш вопрос ...:)

Ах! Вам также нужно взглянуть на onFocusChange Listener . Вы можете добавить этот прослушиватель к каждому элементу предпочтения (который должен быть представлением; вы добавляете прослушиватель в адаптер), затем в методе прослушивателя будет объявлен оператор switch.

Привет, и я надеюсь, что смогу дать вам подсказку,

Julian

...