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