Статьи

Сохранение настроек в вашем приложении Android

Это третий пост в моей серии о сохранении данных в Android. Другие посты можно найти здесь:

http://www.javacodegeeks.com/2014/06/introduction-how-to-save-data-in-your-android-application.html
http://www.javacodegeeks.com/2014/06/saving-data-to-a-file-in-your-android-application.html

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

Если вам необходимо сохранить настройки в вашем приложении, Android SDK включает API настроек, специально предназначенные для хранения данных такого типа. Предпочтения сохраняются классом android.content.SharedPreferences в файл XML, который содержит пары ключ-значение; значения могут быть логическими значениями, числами с плавающей запятой, целыми числами, длинными значениями или строками Если ваше приложение удалено, все настройки также удаляются, так как файл сохраняется во внутреннем хранилище приложения. Значения параметров сохраняются в виде открытого текста, поэтому вам следует зашифровать свои данные, если вы хотите хранить конфиденциальную информацию, такую ​​как учетные данные.

Вы можете сохранить значения непосредственно в файле настроек без действий пользователя, используя класс android.content.SharedPreferences , но, как правило, пользователи устанавливают свои предпочтения из окна настроек, к которому можно получить доступ из панели действий вашего приложения. Чтобы создать окно « Настройки», API-интерфейсы предпочтений включают в себя android.preference.PreferenceFragment для добавления к вашей собственной деятельности. Этот фрагмент показывает список настроек и сохраняет значения, выбранные пользователем, автоматически с помощью класса android.content.SharedPreferences .

Перед использованием android.preference.PreferenceFragment вам необходимо определить, какие предпочтения будут доступны из фрагмента с помощью файла конфигурации, который сохраняется в папке / res / xml / . Основные типы предпочтений доступны в Android SDK, но вы также можете создать свой собственный тип предпочтений, переопределив класс android.preference.Preference или один из его подклассов. Вот пример файла preferences.xml, содержащего android.preference.CheckboxPreference , android.preference.ListPreference и android.preference.EditTextPreference:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference
   android:key="welcome_text"
   android:title="@string/pref_title_welcome_text"
   android:summary="@string/pref_summary_welcome_text"
   android:defaultValue="@string/pref_default_welcome_text" />
<ListPreference
   android:key="welcome_text_color"
   android:title="@string/pref_title_welcome_text_color"
   android:summary="@string/pref_summary_welcome_text_color"
   android:defaultValue="@string/pref_default_welcome_text_color"
   android:entries="@array/colorLabelsArray"
   android:entryValues="@array/colorValuesArray" />
<CheckBoxPreference
   android:defaultValue="true"
   android:key="show_welcome_text"
   android:title="@string/pref_title_show_welcome_text"
   android:summary="@string/pref_summary_show_welcome_text" />
</PreferenceScreen>

После этого вы должны использовать android.preference.PreferenceFragment, чтобы создать свой собственный фрагмент и указать используемую конфигурацию. Ваш собственный фрагмент может быть расширен позже, если вам нужно добавить пользовательские поведения, реализуя android.content.SharedPreferences.OnSharedPreferenceChangeListener, который запускается при изменении предпочтения.

01
02
03
04
05
06
07
08
09
10
11
public class SettingsFragment extends PreferenceFragment {
   @Override
   public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
 
   // Load the preferences as configured in the /res/xml/preferences.xml file
   // and displays them.
   // The preferences will be automatically saved.
   addPreferencesFromResource(R.xml.preferences);
   }
}

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

01
02
03
04
05
06
07
08
09
10
public class SettingsActivity extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
 
   // Display the preferences fragment as the content of the activity
   getFragmentManager().beginTransaction()
                       .replace(android.R.id.content, new SettingsFragment()).commit();
   }
}

Этого достаточно, чтобы автоматически сохранить настройки в файл, но чтобы сделать что-то интересное с сохраненными настройками, вы должны получить их в других ваших действиях. Чтобы получить значения настроек, вы можете использовать класс android.content.SharedPreferences, который возвращается android.preference.PreferenceManager для текущего контекста. Для завершения предыдущего примера следующий код получает объект SharedPreferences во время события onResume действия и изменяет пользовательский интерфейс в соответствии с текущими предпочтениями. Событие onResume вызывается, когда начинается действие, и когда пользователь возвращается из другого действия, в этом случае мы выполняем настройку SettingsActivity для управления настройками.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class MainActivity extends Activity {
   @Override
   public void onResume() {
      super.onResume();
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
 
      TextView welcomeTextView = (TextView) findViewById(R.id.hello_world_textview);
 
      String defaultWelcomeText = getResources().getString(R.string.pref_default_welcome_text);
      String welcomeText = preferences.getString("welcome_text", defaultWelcomeText);
      welcomeTextView.setText(welcomeText);
 
      String defaultWelcomeTextColor = getResources()
                                          .getString(R.string.pref_default_welcome_text_color);
      String welcomeTextColor = preferences.getString("welcome_text_color",
                                                      defaultWelcomeTextColor);
      welcomeTextView.setTextColor(Color.parseColor(welcomeTextColor));
 
      boolean showWelcomeText = preferences.getBoolean("show_welcome_text",
                                                       true /*showWelcomeText*/);
      if (showWelcomeText)
         welcomeTextView.setVisibility(View.VISIBLE);
      else
         welcomeTextView.setVisibility(View.INVISIBLE);
     }
}