Настройте свои параметры . Часть Android Jetpack .
В этом документе описывается, как настроить объекты Preference
в вашей иерархии.
Найти предпочтения
Чтобы получить доступ к отдельному Preference
, например, при получении или установке значения Preference
, используйте PreferenceFragmentCompat.findPreference()
. Этот метод ищет по всей иерархии Preference
с заданным ключом.
Например, чтобы получить доступ EditTextPreference
с ключом "signature"
, выполните следующие действия:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Получите это Preference
, используя следующий код:
Котлин
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) val signaturePreference: EditTextPreference? = findPreference("signature") // Do something with this preference. }
Ява
@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
при выполнении соответствующего условия:
Котлин
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) if(/*some feature*/) { val signaturePreference: EditTextPreference? = findPreference("signature") signaturePreference?.isVisible = true } }
Ява
@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
, как показано в следующем примере:
Котлин
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance() editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
Ява
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance()); editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
Используйте собственный SummaryProvider
Вы можете создать свой собственный SummaryProvider
и переопределить provideSummary()
, чтобы настроить сводку всякий раз, когда она запрашивается Preference
. Например, следующий EditTextPreference
отображает длину сохраненного значения в виде сводки:
В качестве примера предположим следующее EditTextPreference
:
<EditTextPreference app:key="counting" app:title="Counting preference"/>
В onCreatePreferences()
вы можете создать новый SummaryProvider
и переопределить provideSummary()
, чтобы вернуть отображаемую сводку:
Котлин
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 } }
Ява
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
, когда он отображается пользователю.
Котлин
val numberPreference: EditTextPreference? = findPreference("number") numberPreference?.setOnBindEditTextListener { editText -> editText.inputType = InputType.TYPE_CLASS_NUMBER }
Ява
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
, чтобы запускать новый Fragment
, Activity
или отдельное приложение при каждом нажатии Preference
. Это то же самое, что использовать 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
, как показано ниже:
Котлин
val intent = Intent(context, ExampleActivity::class.java) activityPreference.setIntent(intent)
Ява
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>
Котлин
val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("http://www.google.com") val webpagePreference = findPreference("webpage") webpagePreference?.intent = intent
Ява
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
, используйте код, аналогичный следующему:
Котлин
onClickPreference.setOnPreferenceClickListener({ // Do something. true })
Ява
onClickPreference.setOnPreferenceClickListener(preference -> { // Do something. return true; });