Настройки Часть 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(); } }
Результат показан на изображении ниже.
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.