В этом уроке мы будем использовать SharedPreferences
для хранения пользовательских данных в виде пар ключ-значение.
SharedPreferences в Android. Теория
SharedPreferences
позволяют приложениям сохранять настройки в виде пар ключ-значение. Эти настройки сохраняются даже когда пользователь закрывает приложение.
Android хранит SharedPreferences
в виде XML файла в папке shared_prefs по адресу data --> data --> [имя пакета] -->
. Папку data можно получить с помощью вызова метода Environment.getDataDirectory()
.
SharedPreferences
зависят от приложения, то есть сохраненные данные будут удалены из Android устройства после удаления приложения или после очистки данных приложения.
Обзор API SharedPreferences
Android предоставляет три метода получения доступа к SharedPreferences:
- Метод
getPreferences()
используется внутри Activity для доступа к одному общему файлу настроек приложения. - Метод
getSharedPreferences()
используется внутри Activity для доступа к разным файлам настроек приложения. - Метод
getDefaultSharedPreferences()
используется классомPreferenceManager
, чтобы получить доступ к стандартному файлу настроек.
В этом уроке мы познакомимся с методом getSharedPreferences()
подробнее.
Этот метод используется следующим образом:
1 |
getSharedPreferences (String prefs_name, int mode) |
где prefs_name
— имя файла, а mode
— способ получения доступа.
Всего Android предоставляет несколько способов получения доступа:
- MODE_PRIVATE — режим по умолчанию, где созданный файл может быть доступен только вызывающему приложению
- MODE_WORLD_READABLE — создание файлов, к которым могут получить доступ на чтение из любого другого приложения (опасный метод, который часто приводит к проблемам в безопасности приложения)
- MODE_WORLD_WRITEABLE — создание файлов, к которым могут получить доступ (чтение и запись) из любого другого приложения.
- MODE_MULTI_PROCESS был помечен как deprecated в
Android API 23
, так как не работал правильно в некоторых версиях Android и не был потокобезопасным. - MODE_APPEND — добавляет новые настройки к уже существующим.
SharedPreferences в Android. Практика
Начиная с этого урока мы будем выносить текст или названия виджетов, используемых в макете в файл strings.xml
, который находится в папке res/values
вашего проекта. Это является хорошей практикой программирования под Android, которой мы будем следовать. Вот файл strings.xml
для нашего проекта:
1 2 3 4 5 6 |
<resources> <string name="app_name">SharedPreferencesApp</string> <string name="save_txt">Сохранить</string> <string name="retrieve_txt">Получить</string> <string name="clear">Очистить</string> </resources> |
Макет activity_main.xml
состоит из одного виджета EditText
и трех кнопок для сохранения, очистки и получения пользовательских данных из SharedPreferences
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ua.com.prologistic.sharedpreferencesapp.MainActivity"> <Button android:id="@+id/saveBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignTop="@+id/clearBtn" android:onClick="onClick" android:text="@string/save_txt" /> <Button android:id="@+id/getBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignEnd="@+id/editName" android:layout_alignRight="@+id/editName" android:layout_below="@+id/editName" android:onClick="onClick" android:text="@string/retrieve_txt" /> <Button android:id="@+id/clearBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/editName" android:layout_centerHorizontal="true" android:onClick="onClick" android:text="@string/clear" /> <EditText android:id="@+id/editName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:inputType="text" /> </RelativeLayout> |
Обратите внимание, что мы назначили в атрибуте onClick
один и тот же метод. Ниже в листинге класса MyActivity.class
вы увидите как мы обрабатываем нажатия для каждой кнопки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
package ua.com.prologistic.sharedpreferencesapp; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private SharedPreferences sharedPrefs; private EditText editText; public static final String myPrefs = "myprefs"; public static final String nameKey = "nameKey"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editName); // при старте проверяем есть ли в файлах настроек // данные по ключу nameKey sharedPrefs = getSharedPreferences(myPrefs, Context.MODE_PRIVATE); if (sharedPrefs.contains(nameKey)) { // если есть, то ставим значение этого ключа в EditText editText.setText(sharedPrefs.getString(nameKey, "")); } } // метод для сохранения текста в файл настроек public void saveText() { // получаем текст String editTextValue = editText.getText().toString(); // получаем доступ к файлу SharedPreferences.Editor editor = sharedPrefs.edit(); // сохраняем по текст из EditText по ключу nameKey editor.putString(nameKey, editTextValue); editor.apply(); } // метод для получения текста из SharedPreferences по ключу public void getText() { sharedPrefs = getSharedPreferences(myPrefs, Context.MODE_PRIVATE); if (sharedPrefs.contains(nameKey)) { editText.setText(sharedPrefs.getString(nameKey, "")); } } // получаем id нажатого виджета и вызываем соответственный ему метод @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.saveBtn: // сохраняем текст в файл настроек saveText(); Toast.makeText(this, "Сохранить", Toast.LENGTH_LONG).show(); break; case R.id.clearBtn: // очищает текст в виджете EditText editText.setText(""); Toast.makeText(this, "Очистить", Toast.LENGTH_LONG).show(); break; case R.id.getBtn: // получаем текст из SharedPreferences Toast.makeText(this, "Получить", Toast.LENGTH_LONG).show(); getText(); break; } } } |
Обратите внимание, что мы реализуем интерфейс View.OnClickListener
и переопределяем метод onClick()
, в котором с помощью оператора switch находим id виджета, который был нажат. В макете activity_main.xml
именно этот метод мы назначили общим для всех кнопок.
Результат работы приложения сохранения настроек SharedPreferences в Android:
Как видим, на рисунку представлен ход выполнения операций: сначала пишем текст в поле (1), затем нажимаем Сохранить (2), потом нажимаем Очистить (3) и в конце тестируем получение настроек из SharedPreferences — нажимаем Получить (4).
На этом все, следите за обновлениями раздела программирование под Андроид и подписывайтесь на рассылку сайта!