Как вы знаете, в Android существует несколько способов хранения данных. Одним из них является сохранение данных в формате ключ-значение с помощью класса SharedPreferences. Информация, сохраненная таким образом, будет находиться в xml-файле, который расположен в каталоге по адресу /data/data/имя_пакета/shared_prefs/имя_файла_настроек.xml. В качестве аналогии можно привести конфигурационные *.ini файлы для хранения настроек в операционных системах Windows.
Управление настройками приложения лучше всего вынести в рамки одного Activity. Для этих целей Android предлагает нам готовое Activity для работы с настройками. Оно называется PreferenceActivity и умеет читать xml-файлы для того, чтобы затем создать их них экран настроек (предполагается, что читатели этой статьи уже сталкивались ранее с этим классом и имеют базовое представление о том, каким образом он работает). По умолчанию – внешний вид PreferenceActivity зависит от базовой темы приложения (светлой или темной). Порой необходимо изменить цвет фона PreferenceActivity для того, чтобы он соответствовал выбранному вами цветовому стилю приложения. Цель этой статьи – показать каким образом это можно сделать. У нас будет приложение с кнопкой, при нажатии на которую будет открываться окно настроек с измененным фоном.
Давайте приступим к работе. Для начала нужно будет создать проект с одним Activity, на котором будет расположена кнопка. Я решил не менять название класса основного Activity, a вот для кнопке я дал id – “@+id/show_prefs_btn”. Также в файле res/values/strings.xml я добавил строку:
<string name="show_preferences">Show preferences</string>
которую потом указал в качестве текста для кнопки. Также в папке res я создал папку drawable, куда добавил файл background.jpg, который потом указал в качестве фона Activity. Скачать его вы можете по этой ссылке.
Листинг activity_mail.xml
<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" > <Button android:id="@+id/show_prefs_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/show_preferences" /> </RelativeLayout>
Теперь пришло время для создания xml-файла, в котором опишем наши настройки (чекбокс и текстовое поле).
Для начала в папке res нужно создать папку xml а в ней – файл pref.xml. Ниже приведено его содержимое:
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="chb_key" android:summary="Enable delivery" android:title="Delivery"> </CheckBoxPreference> <EditTextPreference android:key="mail" android:summary="E-mail for delivery" android:title="E-mail"> </EditTextPreference> </PreferenceScreen>
Затем нужно создать Activity, которое будет отображать наши настройки. Для этого создайте в пакете приложения еще один класс с названием PrefsActivity со следующим содержимым:
import android.os.Bundle; import android.preference.PreferenceActivity; public class PrefsActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref); } }
Не забудьте добавить PrefsActivity как Activity в файл AndroidManifest.xml. Теперь в классе MainActivity нужно создать обработчик нажатия на кнопку вызова настроек, который будет открывать окно настроек, и назначить его этой кнопке. Попробуйте запустить проект и посмотреть, как сейчас выглядит окно с настройками.
Листинг класса MainActivity
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button mPrefsBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPrefsBtn = (Button)findViewById(R.id.show_prefs_btn); mPrefsBtn.setOnClickListener(mPrefsBtnClickListener); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } OnClickListener mPrefsBtnClickListener = new OnClickListener(){ @Override public void onClick(View v){ Intent prefIntent = new Intent(MainActivity.this, PrefsActivity.class); startActivity(prefIntent); } }; }
После этого необходимо создать стиль для окна настроек. Для этого нужно добавить в файл res/values/styles.xml между тегами
<resources> </resources> следующие строки:
<style name="PreferencesTheme" parent="android:Theme.Light"> <item name="android:windowBackground">@drawable/background</item> </style>
Теперь в AndroidManifest.xml следует указать тему в описании PrefsActivity, добавив эту строку android:theme=»@style/PreferencesTheme», после чего описание окна настроек в манифесте приложения должно выглядеть следующим образом:
<activity android:name="PrefsActivity" android:theme="@style/PreferencesTheme"> </activity>
Запускаем проект – все работает, в окне с настройками отображается указанный нами фон.