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