Настройте свои параметры . Часть 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.
Рисунок 1. Пример 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;
});