Настройте параметры. Входит в Android Jetpack.
В этом документе описано, как настраивать объекты Preference в иерархии.
Найти настройки
Чтобы получить доступ к отдельному объекту Preference, например при получении или установке значения Preference, используйте PreferenceFragmentCompat.findPreference().
Этот метод ищет во всей иерархии Preference с заданным ключом.
Например, чтобы получить доступ к EditTextPreference с ключом "signature", сделайте следующее:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Получите этот Preference с помощью следующего кода:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) val signaturePreference: EditTextPreference? = findPreference("signature") // Do something with this preference. }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); EditTextPreference signaturePreference = findPreference("signature"); // Do something with this preference. }
Как управлять видимостью предпочтений
Вы можете управлять тем, какие объекты Preference будут видны пользователю, когда он переходит на экран настроек. Например, если определенный Preference имеет смысл только при включенной соответствующей функции, вы можете скрыть этот Preference, когда функция отключена.
Чтобы показывать Preference только при выполнении условия, сначала задайте для видимости Preference значение false в XML, как показано в следующем примере:
<EditTextPreference app:key="signature" app:title="Your signature" app:isPreferenceVisible="false"/>
В onCreatePreferences() показывать Preference, когда выполняется соответствующее условие:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) if(/*some feature*/) { val signaturePreference: EditTextPreference? = findPreference("signature") signaturePreference?.isVisible = true } }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); if(/*some feature*/) { EditTextPreference signaturePreference = findPreference("signature"); if (signaturePreference != null) { signaturePreference.setVisible(true); } } }
Динамическое обновление сводок
Если Preference сохраняет данные, то в его сводке должно отображаться текущее значение, чтобы пользователю было проще понять состояние Preference. Например, в EditTextPreference должно быть показано сохраненное текстовое значение, а в ListPreference – выбранный элемент списка. Также у вас могут быть объекты Preference, сводку которых нужно обновлять в зависимости от внутреннего или внешнего состояния приложения, например Preference, который показывает номер версии. Для этого можно использовать SummaryProvider.
Используйте SimpleSummaryProvider
ListPreference и EditTextPreference включают простые реализации SummaryProvider, которые автоматически показывают сохраненное значение Preference в качестве сводки. Если значение не сохранено, отображается "Не задано".
Чтобы включить эти реализации из XML, задайте app:useSimpleSummaryProvider="true".
Вы также можете использовать в коде ListPreference.SimpleSummaryProvider.getInstance() и EditTextPreference.SimpleSummaryProvider.getInstance(), чтобы получить простой экземпляр SummaryProvider, а затем задать его в Preference, как показано в следующем примере:
Kotlin
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance() editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
Java
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance()); editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
Используйте собственный SummaryProvider
Вы можете создать собственный класс SummaryProvider и переопределить метод provideSummary(), чтобы настраивать сводку каждый раз, когда ее запрашивает Preference. Например, в следующем объекте EditTextPreference в качестве сводки отображается длина сохраненного значения:
EditTextPreference.
Рассмотрим следующий пример EditTextPreference:
<EditTextPreference app:key="counting" app:title="Counting preference"/>
В onCreatePreferences() можно создать новый SummaryProvider и переопределить provideSummary(), чтобы возвращать сводку для показа:
Kotlin
val countingPreference: EditTextPreference? = findPreference("counting") countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference -> val text = preference.text if (text.isNullOrEmpty()) { "Not set" } else { "Length of saved value: " + text.length } }
Java
EditTextPreference countingPreference = findPreference("counting"); if (countingPreference != null) { countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() { @Override public CharSequence provideSummary(EditTextPreference preference) { String text = preference.getText(); if (TextUtils.isEmpty(text) || text == null){ return "Not set"; } return "Length of saved value: " + text.length(); } }); }
В сводке Preference отображается длина сохраненного значения или "Не задано", если сохраненного значения нет.
Как настроить диалоговое окно EditTextPreference
В диалоговом окне EditTextPreference можно настроить поведение текстового поля, прикрепив OnBindEditTextListener.
Этот прослушиватель вызывается, когда пользователю показывается диалоговое окно.
Например, вы можете настроить диалоговое окно так, чтобы оно принимало только числа. Сначала создайте EditTextPreference:
<EditTextPreference app:key="number" app:title="Numbers only preference"/>
Затем в onCreatePreferences() создайте новый OnBindEditTextListener и переопределите onBindEditText(), чтобы настроить EditText, когда он показывается пользователю.
Kotlin
val numberPreference: EditTextPreference? = findPreference("number") numberPreference?.setOnBindEditTextListener { editText -> editText.inputType = InputType.TYPE_CLASS_NUMBER }
Java
EditTextPreference numberPreference = findPreference("number"); if (numberPreference != null) { numberPreference.setOnBindEditTextListener( new EditTextPreference.OnBindEditTextListener() { @Override public void onBindEditText(@NonNull EditText editText) { editText.setInputType(InputType.TYPE_CLASS_NUMBER); } }); }
Теперь, когда пользователю показывается диалоговое окно, клавиатура открывается только в цифровом режиме, поэтому пользователь может вводить только цифры в EditText.
Действия с предпочтениями
Для Preference можно задать действие, которое будет выполняться при нажатии. Например, Preference может служить ссылкой на отдельный раздел приложения. Чтобы добавить действие в Preference, можно задать Intent непосредственно в Preference или настроить OnPreferenceClickListener для более конкретной логики.
Задайте намерение
Вы можете настроить Intent для Preference, чтобы при нажатии на Preference открывалось новое окно Fragment, Activity или отдельное приложение. Это то же самое, что использовать Context.startActivity() с заданным Intent.
Вы можете задать Intent в XML с помощью вложенного тега <intent>. В примере ниже определяется Intent, который запускает Activity:
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"/> </Preference>
Вы также можете использовать setIntent() непосредственно в Preference, как показано ниже:
Kotlin
val intent = Intent(context, ExampleActivity::class.java) activityPreference.setIntent(intent)
Java
Intent intent = new Intent(getContext(), ExampleActivity.class); activityPreference.setIntent(intent);
Вы также можете добавить дополнительные данные в Intent с помощью XML:
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"> <extra android:name="example_key" android:value="example_value"/> </intent> </Preference>
Ниже приведен пример Preference с Intent, который открывает веб-страницу.
<Preference app:key="webpage" app:title="View webpage"> <intent android:action="android.intent.action.VIEW" android:data="http://www.google.com" /> </Preference>
Kotlin
val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("http://www.google.com") val webpagePreference = findPreference("webpage") webpagePreference?.intent = intent
Java
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.google.com")); webpagePreference.setIntent(intent);
OnPreferenceClickListener
Вы можете задать OnPreferenceClickListener для Preference, чтобы добавить обратный вызов для onPreferenceClick() при нажатии на Preference. Например, вы можете использовать прослушиватель для перехода к другому объекту Fragment или Activity, если у вас более сложная логика обработки навигации.
Чтобы задать OnPreferenceClickListener, используйте код, похожий на следующий:
Kotlin
onClickPreference.setOnPreferenceClickListener({ // Do something. true })
Java
onClickPreference.setOnPreferenceClickListener(preference -> { // Do something. return true; });