Настройте свои параметры . Часть 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
:
<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
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;
});