Настройки   Часть Android Jetpack.

Настройки позволяют пользователям изменять функциональность и поведение приложения. Настройки могут влиять на поведение в фоновом режиме, например на то, как часто приложение синхронизирует данные с облаком, или они могут быть более широкими, например, изменять содержимое и представление пользовательского интерфейса.

Чтобы интегрировать в приложение настраиваемые пользователем параметры, используйте библиотеку AndroidX Preference. Эта библиотека управляет пользовательским интерфейсом и взаимодействует с хранилищем, поэтому вы определяете только отдельные настройки, которые может настраивать пользователь. В библиотеке есть тема Material Design, которая обеспечивает единообразное взаимодействие с пользователем на разных устройствах и в разных версиях ОС.

Начать

Preference – это базовый строительный блок библиотеки Preference. Экран настроек содержит Preference иерархию. Вы можете определить эту иерархию как ресурс XML или создать иерархию в коде.

В следующих разделах описывается, как создать простой экран настроек с помощью библиотеки AndroidX Preference.

Прежде чем начать, добавьте зависимость библиотеки Preference в файл build.gradle:

Яркий

dependencies {
    implementation "androidx.preference:preference-ktx:1.2.0"
}

Kotlin

dependencies {
    implementation("androidx.preference:preference-ktx:1.2.0")
}

После синхронизации Gradle можно перейти к XML-части задачи.

Как создать иерархию

В проекте перейдите в папку res/xml, создайте файл preferences.xml и добавьте в него следующий код:

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

    <Preference
        app:key="feedback"
        app:title="Send feedback"
        app:summary="Report technical issues or suggest new features"/>

</PreferenceScreen>

Эта иерархия содержит два объекта Preference: SwitchPreferenceCompat, который позволяет пользователям включать и отключать настройку, и базовый объект Preference без виджета.

При создании иерархии у каждого Preference должен быть уникальный ключ.

Развернуть иерархию

Чтобы развернуть иерархию из атрибута XML, создайте PreferenceFragmentCompat, переопределите onCreatePreferences() и укажите ресурс XML, который нужно развернуть, как показано в следующем примере.

Kotlin

class MySettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

Java

public class MySettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);
    }
}

Затем вы можете добавить этот Fragment в Activity, как и любой другой Fragment:

Kotlin

class MySettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.settings_container, MySettingsFragment())
                .commit()
    }
}

Java

public class MySettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
}

Результат показан на изображении ниже.

Изображение с примером экрана настроек
Рисунок 1. Экран настроек, созданный с помощью двух объектов Preference.

Отслеживание предпочтений

Чтобы получать событие при изменении настройки, зарегистрируйте для нее прослушиватель:

Kotlin

findPreference<SwitchPreferenceCompat>("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue")
        true // Return true if the event is handled.
    }

findPreference<Preference>("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked")
        true // Return true if the click is handled.
    }

Java

SwitchPreferenceCompat notificationsPref = findPreference("notifications");

if (notificationsPref != null) {
    notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> {
        Log.d("Preferences", String.format("Notifications enabled: %s", newValue));
        return true; // Return true if the event is handled.
    });
}

Preference feedbackPref = findPreference("feedback");

if (feedbackPref != null) {
    feedbackPref.setOnPreferenceClickListener((preference) -> {
        Log.d("Preferences", "Feedback was clicked");
        return true; // Return true if the event is handled.
    });
}

Прочитать текущее значение настройки

PreferenceFragmentCompat скрывает большую часть механизмов, связанных с сохранением и чтением настроек. Однако все данные хранятся с помощью SharedPreferences, и вы можете считывать эти значения, как обычно SharedPreferences:

Kotlin

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

Java

var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();

preferences.forEach((key, value) ->{
    Log.d("Preferences", String.format("%s -> %s", key, value));
});

Приведенный выше фрагмент кода получает экземпляр SharedPreferences по умолчанию для приложения, обращается ко всем сохраненным значениям, перебирает их и выводит в Logcat.