Это должно появляться очень часто.
Когда пользователь редактирует настройки в приложении для Android, я бы хотел, чтобы они могли видеть текущее установленное значение предпочтения в Preference
сводке.
Пример: если у меня есть параметр Предпочтения для «Отменить старые сообщения», который указывает количество дней, после которых сообщения должны быть очищены. В PreferenceActivity
Я хотел бы пользователю видеть:
"Отменить старые сообщения" <- title
«Очистить сообщения через x дней» <- сводка, где x - текущее значение предпочтения
Дополнительный кредит: сделайте это многоразовым, чтобы я мог легко применить его ко всем моим предпочтениям независимо от их типа (чтобы он работал с EditTextPreference, ListPreference и т. Д. С минимальным количеством кода).
implements OnSharedPreferenceChangeListener
"%s"
forListPreference
иListPreference.getSummary()
отформатировать сводку с текущей выбранной записью (или,""
если она не выбрана).Вот мое решение ... FWIW
источник
EditTextPreference
этоandroid:password="true"
он показывает значениеif editTextPref.getText() == ""
)? Как получить итоговую стоимость приupdatePrefSummary
?p.getSummary()
иeditTextPref.getSummary()
вернуть уже измененные значения.PreferenceCategory
иPreferenceScreen
наследуютPreferenceGroup
, я изменилinitSummary
для обработкиPreferenceGroup
вместо. Это устраняет необходимость в другом циклеonCreate()
. Изменение поведения: вложенные PreferenceScreens теперь также обрабатываются рекурсивно.Документация Android гласит, что маркер форматирования строки можно использовать в
getSummary()
:Простое указание
android:summary="Clean up messages after %s days"
в объявлении ListPreference xml у меня сработало.Примечание: это работает только для
ListPreference
.источник
android:defaultValue="0"
в ListPreference. Это самый разумный ответ и работает для меня.defaultValue
и%s
не работают. На других версиях, как правило, это работает, хотя. Любое решение, пожалуйста? Я уверен, что не хочу писать собственный класс для этого. Невероятно, что Google делает самую тривиальную задачу такой болью.Если вы используете
PreferenceFragment
, это, как я решил это. Это говорит само за себя.источник
updatePreference
CODEif (preference instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) preference; preference.setSummary(editTextPref.getText()); }
благодаря @EddieBunregisterOnSharedPreferenceChangeListener
?findPreference(CharSequence key) This method was deprecated in API level 11. This function is not relevant for a modern fragment-based PreferenceActivity.
PreferenceActivity.findPreference
(и несколько других методов), потому что Google хочет, чтобы вы переключились на метод, показанный в этом ответе, который используетPreferenceFragment.findPreference
вместо этого.Мой вариант - расширить ListPreference, и он чистый:
Затем вы добавляете в свои settings.xml:
источник
init()
Функция необходима для обновления ,summary
когда пользователь изменяет это предпочтение. Без этого он останется таким, каким был изначально.Вы можете переопределить классы предпочтений по умолчанию и реализовать функцию.
Позже в вашем XML вы можете использовать пользовательские настройки, такие как
источник
После нескольких часов, потраченных на решение такой проблемы, я реализовал этот код:
[ОБНОВЛЕНИЕ: окончательный список версий]
Это было единственное решение, которое отлично сработало для меня. Прежде, чем я попытался создать подкласс из ListPreferences и реализовать Android: summary = "bla bla bla% s". Ни один не работал.
источник
Может быть, как ListPreference: измените getSummary, чтобы получить то, что вы хотите:
И используйте это в своем XML:
Таким образом, вы можете написать резюме
%s
вместо фактического значения.источник
android.support.v7.preference.EditTextPreference
, это не обновляет сводку при изменении предпочтения, только когда создается действие предпочтений. Способ обойти это без реализацииOnSharedPreferenceChangeListener.onSharedPreferenceChanged
в классе фрагментов предпочтений также переопределитьandroid.support.v7.preference.EditTextPreference.setText(String text)
:@Override public void setText(String text) { super.setText(text); this.setSummary(this.getText()); }
Это код, который вам нужен для установки сводки на выбранное значение. Он также устанавливает значения при запуске и учитывает значения по умолчанию, а не только при изменении. Просто измените «R.layout.prefs» на ваш xml-файл и расширьте метод setSummary в соответствии с вашими потребностями. На самом деле он обрабатывает только ListPreferences, но его легко настроить с учетом других предпочтений.
koem
источник
setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener onPreferenceChangeListener)
метода индивидуальных настроек.На самом деле, CheckBoxPreference имеет возможность указать другое резюме на основе значения флажка. См. Атрибуты android: summaryOff и android: summaryOn (а также соответствующие методы CheckBoxPreference).
источник
Для EditTextPreference:
источник
Если кто-то все еще ищет ответы на этот вопрос, вы должны проверить тридцать три ответа.
источник
Спасибо за этот совет!
У меня есть один экран настроек, и я хочу показать значение для каждого списка предпочтений в качестве сводки.
Это мой путь сейчас:
Это работает для меня, но мне интересно, какое решение лучше (производительность, стабильность, масштабируемость): то, что показывает Koem, или это?
источник
Спасибо, Рето, за подробное объяснение!
В случае, если это кому-нибудь поможет, мне пришлось изменить код, предложенный Reto Meier, чтобы он работал с SDK для Android 1.5
То же самое изменение применяется к функции обратного вызова
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
Ура,
Крис
источник
Я решил проблему со следующим потомком ListPreference:
Кажется, работает хорошо для меня в 1.6 до 4.0.4.
источник
источник
Я видел, как все проголосовавшие ответы показывают, как установить итоговое значение с точным текущим значением, но ОП также хотел что-то вроде:
Вот мой ответ для достижения этого
Как сказано в документации о
ListPreference.getSummary()
:Тем не менее, я попробовал на нескольких устройствах, и это не похоже на работу. С некоторыми исследованиями я нашел хорошее решение в этом ответе . Он просто состоит из расширения каждого
Preference
используемого и переопределенияgetSummary()
для работы, как указано в документации Android.источник
Если вы хотите, чтобы в качестве сводки отображалось только текстовое значение каждого поля, следующий код должен быть самым простым в обслуживании. Требуется только два изменения (строки 13 и 21, помеченные «изменить здесь»):
источник
Вот мое решение:
Создайте метод предпочтения типа getter.
Создайте метод setSummaryInit.
Initialize
Создайте открытый класс, который PreferenceActivity и реализует OnSharedPreferenceChangeListener
источник
Просто:
источник
FYI:
Все больше оснований смотреть на самом пятне
Answer
из @ASD выше ( здесь источник ) , говорящий использовать%s
вandroid:summary
для каждого поляpreferences.xml
. (Текущее значение предпочтения заменяется%s
.)источник
Поскольку в классе androidx Preference имеется интерфейс SummaryProvider , это можно сделать без OnSharedPreferenceChangeListener. Простые реализации предоставляются для EditTextPreference и ListPreference. Опираясь на ответ EddieB, он может выглядеть следующим образом. Протестировано на androidx.preference: предпочтение: 1.1.0-alpha03.
источник
Согласно Android документам вы можете использовать
app:useSimpleSummaryProvider="true"
компоненты ListPreference и EditTextPreference.источник
Здесь все это вырезано из образца Eclipse
SettingsActivity
. Я должен скопировать все эти слишком много кодов, чтобы показать, как эти разработчики Android выбирают идеально для более общего и стабильного стиля кодирования.Я оставил коды для адаптации
PreferenceActivity
к планшету и большему API.xml/pref_general.xml
values/strings_activity_settings.xml
ПРИМЕЧАНИЕ. На самом деле я просто хочу прокомментировать: «Пример Google для PreferenceActivity также интересен». Но у меня недостаточно очков репутации. Поэтому, пожалуйста, не вините меня.
(Простите за плохой английский)
источник
Вы должны использовать функцию bindPreferenceSummaryToValue в методе onCreate.
Пример:
См. Урок 3 по курсу Udacity для Android: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601
источник
Для EditTextPreference :
Конечно, я пришел к этому решению, просто если вам нужно определенное предпочтение edittext, но вы можете сделать это с каждым предпочтением:
............
............
Тогда в onResume ();
В:
источник
Мое решение состоит в том, чтобы создать кастом
EditTextPreference
, используемый в XML следующим образом:<com.example.EditTextPreference android:title="Example Title" />
EditTextPreference.java : -
источник
Чтобы установить сводку a
ListPreference
к значению, выбранному в диалоговом окне, вы можете использовать этот код:и ссылаться на
yourpackage.ListPreference
объект, который выpreferences.xml
запомнили, чтобы указать там ваш,android:defaultValue
поскольку это вызывает вызовonSetInitialValue()
.Если вы хотите, вы можете изменить текст, прежде чем вызывать
setSummary()
то, что подходит для вашего приложения.источник
Поскольку я использую обычай
PreferenceDataStore
, я не могу добавить слушателя для некоторых,SharedPreference
поэтому мне пришлось написать несколько хакерское решение, которое слушает каждый параметр:источник
Если вы используете AndroidX, вы можете использовать обычай
SummaryProvider
. Этот подход может быть использован для любогоPreference
.Пример из документации (Java):
Пример из документации (Котлин):
источник