Вы здесь

Кастомизация PreferenceActivity. Часть 1 – изменение фона.

Как вы знаете, в 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>

Запускаем проект – все работает, в окне с настройками отображается указанный нами фон.