Чтобы получить экземпляр класса SharedPreferences для получения доступа к настройкам в коде приложения используются три метода:
getPreferences()
— внутри активности, чтобы обратиться к определенному для активности предпочтению;
getSharedPreferences()
— внутри активности, чтобы обратиться к предпочтению на уровне приложения;
getDefaultSharedPreferences()
— из объекта PreferencesManager
, чтобы получить общедоступную настройку, предоставляемую Android.
Все эти методы возвращают экземпляр класса SharedPreferences, из которого можно получить соответствующую настройку с помощью ряда методов:
getBoolean(String key, boolean defValue);
getFloat(String key, float defValue);
getInt(String key, int defValue);
getLong(String key, long defValue);
getString(String key, String defValue)
Чтобы создать или изменить Общие настройки, нужно вызвать метод getSharedPreferences
в контексте приложения, передав имя общих настроек (имя файла):
SharedPreferences mySharedPreferences = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
Файлы настроек хранятся в каталоге /data/data/имя_пакета/shared_prefs/имя_файла_настроек.xml
. Поэтому в отладочных целях, если вам нужно сбросить настройки в эмуляторе, то при помощи перспективы DDMS, используя файловый менеджер, зайдите в нужную папку, удалите файл настроек и перезапустите эмулятор, так как эмулятор хранит данные в памяти, которые он сбрасывает в файл. На устройстве вы можете удалить программу и поставить ее заново, тоже самое можно сделать и на эмуляторе, что бывает проще, чем удалять файл настроек вручную и перезапускать эмулятор.
Если открыть файл настроек текстовым редактором, то можно увидеть приблизительно:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="0005">|000000|000000|000000|0</string>
<string name="0004">|000000|000000|000000|1</string>
<string name="0006">|000000|000000|000000|0</string>
</map>
В данном случае в настройках хранятся только строковые значения.
Для удобства создадим константу для имени файла настроек, например:
// это будет именем файла настроек
public static final String APP_PREFERENCES = "mysettings";
Далее нужно создать параметры, которые вы хотите сохранять в настройках. Удобнее их сделать константами:
public static final String APP_PREFERENCES_NAME = "Nickname"; // имя
public static final String APP_PREFERENCES_AGE = "Age"; // возраст
Когда вы определили названия параметров, то можете сохранять любые значения этих параметров. Для этого создаём переменную, представляющую экземпляр класса SharedPreferences
:
SharedPreferences mSettings;
Внутри метода onCreate()
вы инициализируете эту переменную:
mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
Вы передаёте в указанный метод название вашего файла (он будет создан автоматически) и стандартное разрешение, дающее доступ только компонентам приложения.
Чтобы внести изменения в настройки (редактировать), нужно использовать класс SharedPreferences.Editor
. Получить объект Editor
можно через вызов метода edit объекта SharedPreferences
, который вы хотите изменить. После того, как вы внесли все необходимые изменения, вызовите метод commit()
или apply()
объекта Editor
, чтобы изменения вступили в силу. Метод apply()
появился в API
и работает в асинхронном режиме, что является более предпочтительным вариантом. Метод commit()
приходится использовать для старых версий и кроме того, он возвращает значение true
в успешном случае и false
в случае ошибки. Если вам надо отслеживать ошибки, то используйте его.
Предположим, что у нас есть два текстовых поля, где пользователь должен ввести имя кота и его и возраст. Чтобы сохранить параметр, нужно получить текст, который ввел пользователь, через метод getText().toString()
:
EditText editNickname = (EditText)findViewById(R.id.editNickname);
String strNickName = editNickname.getText().toString(); // здесь содержится текст, введенный в текстовом поле
Получив нужный текст, сохраняем его через метод putString()
(есть также putLong()
, putBoolean()
и т.п.):
Editor editor = mSettings.edit();
editor.putString(APP_PREFERENCES_NAME, strNickName);
editor.apply();
Как правило, параметры сохраняют в методах активности onPause()
или onStop()
в тех случаях, когда данные требуются сохранить между запусками приложения. Но могут быть и другие сценарии.
Для считывания данных при загрузке приложения обычно используют методы onCreate()
или onResume()
. Нам нужно получить доступ к настройкам программы и проверить, есть ли среди них нужный нам параметр. Нас интересует ключ Nickname
. Если мы его найдём, то загрузим его значение в текстовое поле.
if(mSettings.contains(APP_PREFERENCES_NAME)) {
nicknameText.setText(mSettings.getString(APP_PREFERENCES_NAME, ""));
}
В этих строчках кода мы проверили существование параметра APP_PREFERENCES_NAME
и получили его значение через getString()
, передавая ключ и значение по умолчанию (используется в том случае, если для данного ключа пока что не сохранено никакое значение). Осталось только загрузить полученный результат в текстовое поле.
Аналогично поступаем и с другими параметрами через методы get<тип>() (getLong, getBoolean()
и т.д.
Разметка:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/buttonSave"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Сохранить" />
<Button
android:id="@+id/buttonGet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Получить" />
<TextView
android:id="@+id/tvInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="" />
<EditText
android:id="@+id/editNickname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
</LinearLayout>
Код:
public class MainActivity extends Activity {
// имя настройки
public static final String APP_PREFERENCES = "mysettings";
public static final String APP_PREFERENCES_NICKNAME = "Nickname";
public static final String APP_PREFERENCES_AGE = "Age";
SharedPreferences mSettings;
EditText editNickname;
TextView tvInfo;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
editNickname = (EditText) findViewById(R.id.editNickname);
tvInfo = (TextView)findViewById(R.id.tvInfo);
}
// Щелчки кнопок
public void onClick(View v) {
switch (v.getId()) {
// Кнопка сохранения данных
case R.id.buttonSave:
// здесь содержится текст, введенный в текстовом поле
String strNickName = editNickname.getText().toString();
Editor editor = mSettings.edit();
editor.putString(APP_PREFERENCES_NICKNAME, strNickName);
editor.apply();
break;
// Кнопка извлечения данных
case R.id.buttonGet:
if (mSettings.contains(APP_PREFERENCES_NICKNAME)) {
// выводим данные в TextView
tvInfo.setText(mSettings.getString(APP_PREFERENCES_NICKNAME,
""));
}
break;
}
}
}
Можно получить ассоциативный массив со всеми ключами и значениями через метод getAll()
. После этого можно проверить наличие конкретного ключа с помощью метода contains()
.
Map<String, ?> allPreferences = mySharedPreferences.getAll();
boolean containtsNickName = mySharedPreferences.contains(APP_PREFERENCES_NICKNAME);
Для очистки значений используйте методы SharedPreferences.Editor.remove(String key)
и SharedPreferences.Editor.clear()
.
Layout | Диалоговые окна |