Preferences. Сохранение данных в настройках


В реальных приложениях под Андроид часто необходимо сохранять данные и позднее вновь получать к ним доступ. В Андроиде есть несколько способов хранения данных. В данном уроке мы рассмотрим один из них — использование настроек (Preferences). Что такое Preferences? По сути, это локальное хранилище. Данные сохраняются в файлике, который хранится в «физическом» пространстве устройства. Таких файлов может быть множество, и имеется возможность задавать для них имя. По умолчанию имя соответствует имени активити, в котором происходит сохранение в Preferences.

Создадим простое приложение, которое будет включать в себя два экрана. В первом будет содержаться поле для ввода текста и кнопка. После ввода текста и клика по кнопке данные будут сохраняться в Preferences. После этого приложение перебросит нас на второе активити, где мы будем извлекать введенные в первом активити данные из Preferences и выводить их в TextView.

Сверстаем наш первый экран. Содержимое файла res/layout/activity_main.xml:

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
<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=".MainActivity" >
 
    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="26dp"
        android:inputType="text"
        android:ems="10" >
 
        <requestFocus />
    </EditText>
 
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/editText1"
        android:layout_below="@+id/editText1"
        android:layout_marginRight="65dp"
        android:layout_marginTop="49dp"
        android:text="@string/save" />
 
</RelativeLayout>

Текст для кнопки сделаем строковым ресурсом («save») и положим его в res/values/strings.xml:

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Preferences</string>
    <string name="action_settings">Settings</string>    
    <string name="save">Сохранить</string>
</resources>

Создадим Java-класс для основного экрана. Содержимое файла MainActivity.java:

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
package ru.androiddocs.preferences;
 
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
 
public class MainActivity extends Activity {
 
    EditText editField;
    Button butt;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        butt = (Button) findViewById(R.id.button1);
        editField = (EditText) findViewById(R.id.editText1);
 
        butt.setOnClickListener(new OnClickListener() {
 
            public void onClick(View v) {
                String text = editField.getText().toString();
                SharedPreferences pref = getSharedPreferences("main", MODE_PRIVATE);
                Editor editPref = pref.edit();
                editPref.putString("my_string", text);
                editPref.commit();
 
                Intent int1 = new Intent(MainActivity.this, Second.class);
                startActivity(int1);
            }
        });
    }   
}

Внутри метода onCreate после «установки» layout мы получаем доступ к компонентам нашего экрана (текстовому полю и кнопке). Используем для этого метод findViewById:

1
2
Button butt = (Button) findViewById(R.id.button1);
editField = (EditText) findViewById(R.id.editText1);

Далее для кнопки мы устанавливаем обработчик события (клик) с помощью метода setOnClickListener(). Если происходит клик по кнопке, то отрабатывается метод onClick, внутри которого мы извлекаем данные из текстового поля и сохраняем их в настройках как пару «ключ-значение». Работа с настройками происходит в строчках:

1
2
3
4
SharedPreferences pref = getSharedPreferences("main", MODE_PRIVATE);
Editor editPref = pref.edit();
editPref.putString("my_string", text);
editPref.commit();

Мы получаем объект SharedPreferences в режиме MODE_PRIVATE (данные будут доступны только этому приложению). Объект SharedPreferences позволяет нам иметь доступ к этим настройкам в любом активити нашего приложения. Данные будут сохраняться в файлике с именем «main». Мы получаем редактор editPref и, используя его метод putString(), сохраняем пару «ключ-значение», где в качестве значения выступает наш введенный текст. По окончанию мы делаем commit(), который собственно отправляет данные из редактора в Preferences.

Создадим класс java для второго активити — Second.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package ru.androiddocs.preferences;
 
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;
 
public class Second extends Activity {
 
    TextView textFrom;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
 
        textFrom = (TextView) findViewById(R.id.textView1);
        SharedPreferences pref = getSharedPreferences("main", MODE_PRIVATE);
        String text = pref.getString("my_string", "").toString();
        textFrom.setText(text);
	}
}

Здесь все просто. Устанавливаем нужный layout (activity_second), находим в нем TextView, получаем доступ к объекту SharedPreferences и достаем нужные нам данные по ключу «my_string». Вторым параметром метода getString() идет значение по умолчанию, которое бы установилось, если бы в настройках не оказалось нужных данных. И по окончанию мы устанавливаем наш текст в TextView.

Разметка для второго активити — activity_second.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
 
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
 
</LinearLayout>

Добавим информацию о втором активити в AndroidManifest.xml

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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.androiddocs.preferences"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="ru.androiddocs.preferences.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="ru.androiddocs.preferences.Second" />
    </application>
 
</manifest>

Теперь запускаем и тестируем. Вводим текст приветствия:

После перехода на новый экран получаем ту же строку:

При работе с Preferences из фрагмента, необходимо использовать метод getActivity() для определения текущего контекста:

1
SharedPreferences pref = getActivity().getSharedPreferences("main", 0);

0 — означает константу MODE_PRIVATE.

Источник: zapozdravleniem.ru

Комментариев: 4 на “Preferences. Сохранение данных в настройках

  1. Igor

    А как во втором активити вместо TextView использовать ListView…и туда записывать введенные данные и сохранять их???

    Reply
  2. dkonst

    Подскажите, пожалуйста. Нигде не могу найти ответ. Написал свое приложение с использованием SharedPreferences. Все замечательно работает, но в инсталлятор (apk), файл с настройками не кладется и после каждой установки приложения, т.к. файла с настройками не существует, приходится забивать настройки вручную из приложения, файл тогда, соответственно, создается автоматически. Сейчас я проверяю наличие файла при запуске, и если его нет создаю его, забивая в него все настройки по-умолчанию. На мой взгляд это не правильный подход. Подскажите, как сохранить файл с заранее созданными настройками в инсталлятор.

    Reply
    1. admin Post author

      При первом запуске приложения (при первом обращении к настройкам) данных в SharedPreferences еще нет. Если нужны какие-то дефолтные настройки, то используйте значение по умолчанию, когда достаете какую-то настройку.

      Reply

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*