Android java app settings

Настройки в Android-приложениях

Интересуюсь темой разработки под Android. Пишу небольшое приложение. Столкнулся с тем, что не до конца понимаю как правильно делать настройки для приложения. Немного погуглил, нашел статью, которая помогла разобраться. Решил перевести статью для русскоязычного сообщества, включив некоторые комментарии к оригиналу.

Настройки являются важной частью приложений на Android (и не только на Android — здесь и далее примечание переводчика). Это очень важно — позволять пользователям изменять настройки приложения, в зависимости от их предпочтений.

Существует два пути работы с настройками в Android — можно создать файл preferences.xml в директории res/xml, либо работать с настройками из кода. В данной статье я покажу как работать с настройками, используя preferences.xml файл.

  • android:key — имя настройки, по поторому в дальнейшем можно получить ее значение
  • android:title — заголовок элемента настройки
  • android:summary — краткое описание элемента настройки
  • android:defaultValue — значение по умолчанию
  • CheckBoxPreference — простой чекбокс, который возвращает значения true или false.
  • ListPreference — группа переключателей (radioGroup), из которых может быть выбран только один элемент. Атрибут android:entries указывает на массив со значениями в res/values/arrays.xml, а android:entryValues на массив с подписями.
  • EditTextPreference — показывает диалоговое окно с полем ввода. Возвращает строку в качестве значения.
  • RingtonePreference — группа переключателей с выбором рингтона.
  • Preference — настройка, работающая как кнопка.
  • PreferenceScreen — экран с настройками. Когда один PreferenceScreen вложен в другой, то открывается новый экран с настройками.
  • PreferenceCategory — категория настроек.
Экран с настройками
EditTextPreference
ListPreference
RingtonePreference
PreferenceScreen

Скриншоты выше были сгенерированы при помощи следующего preferences.xml:

Атрибуты android:entries и android:entryValues у ListPreference ссылаются на @array/listArray и @array/listValues соответственно. Значения берутся из res/values/arrays.xml, который в нашем случае выглядит следующим образом:

   Number 1 Number 2 Number 3 Number 4  1 2 3 4   

Для того, чтобы показать пользователю экран с настройками, небходимо создать активити, унаследованное от PreferenceActivity. Пример активити:

package org.kaloer.preferenceexample; import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.Preference.OnPreferenceClickListener; import android.widget.Toast; public class Preferences extends PreferenceActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); // Get the custom preference Preference customPref = (Preference) findPreference("customPref"); customPref .setOnPreferenceClickListener(new OnPreferenceClickListener() < public boolean onPreferenceClick(Preference preference) < Toast.makeText(getBaseContext(), "The custom preference has been clicked", Toast.LENGTH_LONG).show(); SharedPreferences customSharedPreference = getSharedPreferences( "myCustomSharedPrefs", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = customSharedPreference .edit(); editor.putString("myCustomPref", "The preference has been clicked"); editor.commit(); return true; >>); > > 

А вызвать активити с настройками можно, нажав на кнопку на нашем главном активити:

 @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); Button prefBtn = (Button) findViewById(R.id.prefButton); prefBtn.setOnClickListener(new OnClickListener() < public void onClick(View v) < Intent settingsActivity = new Intent(getBaseContext(), Preferences.class); startActivity(settingsActivity); >>); > 

Для того, чтобы использовать выставленными в настройках значениями, добавим метод getPrefs() в главное активити, который нужно вызывать на событии onStart(). Нужно использовать именно onStart(), а не onCreate(), для того, чтобы быть уверенным в том, что используются актуальные настройки, а не те, что были во время создания гланого активити. Наш метод getPrefs() может выглядеть примерно вот так:

 boolean CheckboxPreference; String ListPreference; String editTextPreference; String ringtonePreference; String secondEditTextPreference; String customPref; private void getPrefs() < // Get the xml/preferences.xml preferences SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(getBaseContext()); CheckboxPreference = prefs.getBoolean("checkboxPref", true); ListPreference = prefs.getString("listPref", "nr1"); editTextPreference = prefs.getString("editTextPref", "Nothing has been entered"); ringtonePreference = prefs.getString("ringtonePref", "DEFAULT_RINGTONE_URI"); secondEditTextPreference = prefs.getString("SecondEditTextPref", "Nothing has been entered"); // Get the custom preference SharedPreferences mySharedPreferences = getSharedPreferences( "myCustomSharedPrefs", Activity.MODE_PRIVATE); customPref = mySharedPreferences.getString("myCusomPref", ""); >

И на последок, не забудте добавить созданное активити с настройками в androidmanifest.xml и добавить новую строку с именем «set_preferences», для обозначения заголовка экрана с настройками, например «Preferences».

В итоге, мы получим следующее:

Экран с главным активити
Активити с настройками

Источник

Android java app settings

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

В качестве значений могут выступать данные следующих типов: Boolean, Float, Integer, Long, String, набор строк.

Настройки общими для всех activity в приложении, но также могут быть и настройки непосредственно для отдельных activity

Настройки хранятся в xml-файлах в незашифрованном виде в локальном хранилище. Они невидимы, поэтому для простого пользователя недоступны.

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

Общие настройки

Для работы с разделяемыми настройками в классе Activity (точнее в его базовом классе Context) имеется метод getSharedPreferences() :

import android.content.SharedPreferences; //. SharedPreferences settings = getSharedPreferences("PreferencesName", MODE_PRIVATE);

Первый параметр метода указывает на название настроек. В данном случае название — «PreferencesName». Если настроек с подобным названием нет, то они создаются при вызове данного метода. Второй параметр указывает на режим доступа. В данном случае режим описан константой MODE_PRIVATE

Класс android.content.SharedPreferences предоставляет ряд методов для управления настройками:

  • contains(String key) : возвращает true, если в настройках сохранено значение с ключом key
  • getAll() : возвращает все сохраненные в настройках значения
  • getBoolean (String key, boolean defValue) : возвращает из настроек значение типа Boolean, которое имеет ключ key. Если элемента с таким ключом не окажется, то возвращается значение defValue, передаваемое вторым параметром
  • getFloat(String key, float defValue) : возвращает значение типа float с ключом key. Если элемента с таким ключом не окажется, то возвращается значение defValue
  • getInt(String key, int defValue) : возвращает значение типа int с ключом key
  • getLong(String key, long defValue) : возвращает значение типа long с ключом key
  • getString(String key, String defValue) : возвращает строковое значение с ключом key
  • getStringSet(String key, Set defValues) : возвращает массив строк с ключом key
  • edit() : возвращает объект SharedPreferences.Editor , который используется для редактирования настроек

Для управления настройками используется объект класса SharedPreferences.Editor , возвращаемый метод edit() . Он определяет следующие методы:

  • clear() : удаляет все настройки
  • remove(String key) : удаляет из настроек значение с ключом key
  • putBoolean(String key, boolean value) : добавляет в настройки значение типа boolean с ключом key
  • putFloat(String key, float value) : добавляет в настройки значение типа float с ключом key
  • putInt(String key, int value) : добавляет в настройки значение int с ключом key
  • putLong(String key, long value) : добавляет в настройки значение типа long с ключом key
  • putString(String key, String value) : добавляет в настройки строку с ключом key
  • putStringSet(String key, Set values) : добавляет в настройки строковый массив
  • commit() : подтверждает все изменения в настройках
  • apply() : также, как и метод commit(), подтверждает все изменения в настройках, однако измененный объект SharedPreferences вначале сохраняется во временной памяти, и лишь затем в результате асинхронной операции записывается на мобильное устройство

Рассмотрим пример сохранения и получения настроек в приложении. Определим в файле activity_main.xml следующий пользовательский интерфейс:

На экране будут две кнопки — для сохранения и для вывода ранее сохраненного значения, а также поле для ввода и текстовое поля ля вывода сохраненной настройки.

Определим методы обработчики кнопок в классе MainActivity :

package com.example.settingsapp; import androidx.appcompat.app.AppCompatActivity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < private static final String PREFS_FILE = "Account"; private static final String PREF_NAME = "Name"; SharedPreferences settings; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); settings = getSharedPreferences(PREFS_FILE, MODE_PRIVATE); >public void saveName(View view) < // получаем введенное имя EditText nameBox = findViewById(R.id.nameBox); String name = nameBox.getText().toString(); // сохраняем его в настройках SharedPreferences.Editor prefEditor = settings.edit(); prefEditor.putString(PREF_NAME, name); prefEditor.apply(); >public void getName(View view) < // получаем сохраненное имя TextView nameView = findViewById(R.id.nameView); String name = settings.getString(PREF_NAME,"не определено"); nameView.setText(name); >>

При отсутствии настроек при попытке их получить, приложение выведет значение по умолчанию:

Получение настроек SharedPreferences preferences в Android и Java

Теперь сохраним и выведем заново сохраненное значение:

Сохранение настроек SharedPreferences preferences в Android и Java

Нередко возникает задача автоматически сохранять вводимые данные при выходе пользователя из activity. Для этого мы можем переопределить метод onPause:

package com.example.settingsapp; import androidx.appcompat.app.AppCompatActivity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity < private static final String PREFS_FILE = "Account"; private static final String PREF_NAME = "Name"; EditText nameBox; SharedPreferences settings; SharedPreferences.Editor prefEditor; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameBox = findViewById(R.id.nameBox); settings = getSharedPreferences(PREFS_FILE, MODE_PRIVATE); // получаем настройки String name = settings.getString(PREF_NAME,""); nameBox.setText(name); >@Override protected void onPause() < super.onPause(); String name = nameBox.getText().toString(); // сохраняем в настройках prefEditor = settings.edit(); prefEditor.putString(PREF_NAME, name); prefEditor.apply(); >public void saveName(View view) < >public void getName(View view) < >>

Приватные настройки

Кроме общих настроек каждая activity может использовать приватные, к которым доступ из других activity будет невозможен. Для получения настроек уровня activity используется метод getPreferences(MODE_PRIVATE) :

import android.content.SharedPreferences; //. SharedPreferences settings = getPreferences(MODE_PRIVATE);

То есть в отличие от общих настроек здесь не используется название группы настроек в качестве первого параметра, как в методе getSharedPreferences() . Однако вся остальная работа по добавлению, получению и изменению настроек будет аналогична работает с общими настройками.

Источник

Читайте также:  Название документа
Оцените статью