Правильная радиогруппа в PreferenceActivity

#android #preferenceactivity

#Android #preferenceactivity

Вопрос:

Возможно ли определить радиогруппу в PreferenceActivity? Я мог найти ListView только при предложении нескольких вариантов.

Я что-то упускаю?

Ответ №1:

Вы можете расширить любой Preference класс. Я сделал именно то, что вы ищете, например, расширив PreferenceCategory . Добавьте дочерние настройки (такие как PreferenceScreen и EditTextPreference ), как обычно, с помощью addPreference() , переопределите их и измените / установите ресурс виджета с помощью кода с помощью setWidgetLayoutResource() . Естественно, ваш новый виджет должен содержать RadioButton . Установите пользовательскую OnPreferenceClickListener с setOnPreferenceClickListener() помощью.

Затем получите ссылку на ViewGroup «родительский элемент» в onCreateView() . Затем вы можете привести ее к ListView в onBindView() и установить OnHierarchyChangeListener для нее. Теперь вы получаете уведомление, когда дочерние Preference View элементы добавляются в ListView . Установите новую View.OnClickListener для новой View в иерархии, но только если она View содержит RadioButton . Теперь управляйте щелчками.

На самом деле это довольно просто, если вам нужно только добавить PreferenceScreen в качестве дочерних элементов. Мне также нужно было это с EditTextPreference , что было сложной частью.

Преимущества просты: вы получаете внешний вид и поведение фреймворка предпочтений по умолчанию вне контекста ListPreference . A ListPreference также выглядит по-другому. Кроме того, ListPreference может содержать только предопределенные значения. Итак, если вам нужно, чтобы EditTextPreference было выбрано с помощью переключателя, это было бы невозможно.

Комментарии:

1. Это сложнее и более хрупко, чем простое расширение Preference или DialogPreference . Например, вы предполагаете, что ViewGroup является ListView (не гарантируется). Поскольку вы отклонили мой ответ, можно было бы надеяться, что вы придумали что-то, что на самом деле лучше, а не хуже.

2. Все представления предпочтений обычно привязаны к ListView . Я не понимаю вашей точки зрения. Кроме того, всегда есть возможность добавить некоторые проверки.

3. «Все представления предпочтений обычно привязаны к ListView» — это деталь реализации. Android 5.0 может это изменить. Не создавайте производственный код, который зависит от деталей реализации.

4. Это могло бы быть, но это проблема другого дня и совершенно другой темы. Использование SDK также не является гарантией прямой совместимости. Вопрос был в том, возможно ли это. Да, это так.

5. Я никогда не говорил, что это невозможно. Вы не объяснили, почему ваше решение было лучше моего, и, следовательно, оправдали свой отказ от моего ответа. И хотя «привязка к SDK также не является гарантией прямой совместимости», это не оправдывает намеренного ухудшения ситуации путем принятия деталей реализации.

Ответ №2:

Посмотрите на демонстрационные версии API App — Preferences — Настройки из XML или других примеров.

В принципе, вы можете скопировать этот код. Есть запись, которая отображает список с радиогруппой.

У меня сейчас нет кода, но вы можете взглянуть здесь, он похож:

http://www.kaloer.com/android-preferences

 <ListPreference
                    android:title="List Preference"
                    android:summary="This preference allows to select an item in a array"
                    android:key="listPref"
                    android:defaultValue="digiGreen"
                    android:entries="@array/listArray"
                    android:entryValues="@array/listValues" />
  

Комментарии:

1. Все, что я вижу там, — это ListView. Это не конец света, но я бы предпочел радиогруппу, поскольку это выбор из 3 возможностей. OTOH, если стандартным способом является ListView, то я буду придерживаться этого.

2. Предоставленная вами ссылка не работает.

Ответ №3:

Возможно ли определить радиогруппу в PreferenceActivity?

Вы можете создать свой собственный DialogPreference подкласс, в котором будет размещаться a RadioGroup , но неясно, какую выгоду это даст вам по сравнению с a ListPreference .

Я мог найти ListView только при предложении нескольких вариантов.

A ListPreference предлагает один выбор, а не несколько вариантов. Существует новая MultiSelectListPreference функция множественного выбора, но она появилась только на уровне API 11.

Комментарии:

1. > «но неясно, какую выгоду это вам даст» Выгода очевидна: одним щелчком мыши меньше и UX. Ожидается возможность наблюдения (пользователем) всех возможных вариантов в содержащем диалоговом окне.

2. @avesus: «Выгода очевидна: на один клик меньше и UX удобнее» — нажатие на RadioButton — это один клик. Щелчок по ListView строке выполняется одним щелчком мыши. «Ожидается наблюдаемость (пользователем) всех возможных вариантов в содержащем диалоговом окне» — «наблюдаемость» будет примерно равной, поскольку не все обязательно будет соответствовать экрану, и поэтому оба варианта должны будут поддерживать некоторую форму прокрутки.