Урок 74. Preferences. Программное создание экрана настроек
В этом уроке:
- создаем экран настроек программно
На прошлых уроках мы создавали экран настроек из xml файлов. Теперь попробуем сделать это в коде. Попробуем создать экран с прошлого урока.
Создадим проект:
Project name: P0741_PreferencesCode
Build Target: Android 2.3.3
Application name: PreferencesCode
Package name: ru.startandroid.develop.p0741preferencescode
Create Activity: MainActivity
Заполним strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">PreferencesCode</string>
<string-array name="entries">
<item>one</item>
<item>two</item>
<item>three</item>
</string-array>
<string-array name="entry_values">
<item>1</item>
<item>2</item>
<item>3</item>
</string-array>
</resources>
Напомню xml-код настроек из прошлого урока:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="chb1"
android:summaryOff="Description of checkbox 1 off"
android:summaryOn="Description of checkbox 1 on"
android:title="CheckBox 1">
</CheckBoxPreference>
<ListPreference
android:dependency="chb1"
android:entries="@array/entries"
android:entryValues="@array/entry_values"
android:key="list"
android:summary="Description of list"
android:title="List">
</ListPreference>
<CheckBoxPreference
android:key="chb2"
android:summary="Description of checkbox 2"
android:title="CheckBox 2">
</CheckBoxPreference>
<PreferenceScreen
android:dependency="chb2"
android:key="screen"
android:summary="Description of screen"
android:title="Screen">
<CheckBoxPreference
android:key="chb3"
android:summary="Description of checkbox 3"
android:title="CheckBox 3">
</CheckBoxPreference>
<PreferenceCategory
android:key="categ1"
android:summary="Description of category 1"
android:title="Category 1">
<CheckBoxPreference
android:key="chb4"
android:summary="Description of checkbox 4"
android:title="CheckBox 4">
</CheckBoxPreference>
</PreferenceCategory>
<PreferenceCategory
android:key="categ2"
android:summary="Description of category 2"
android:title="Category 2">
<CheckBoxPreference
android:key="chb5"
android:summary="Description of checkbox 5"
android:title="CheckBox 5">
</CheckBoxPreference>
<CheckBoxPreference
android:key="chb6"
android:summary="Description of checkbox 6"
android:title="CheckBox 6">
</CheckBoxPreference>
</PreferenceCategory>
</PreferenceScreen>
</PreferenceScreen>
Попытаемся создать все эти элементы программно.
Создаем PrefActivity.java:
package ru.startandroid.develop.p0741preferencescode;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
public class PrefActivity extends PreferenceActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// создаем экран
PreferenceScreen rootScreen = getPreferenceManager().createPreferenceScreen(this);
// говорим Activity, что rootScreen - корневой
setPreferenceScreen(rootScreen);
// даллее создаем элементы, присваиваем атрибуты и формируем иерархию
CheckBoxPreference chb1 = new CheckBoxPreference(this);
chb1.setKey("chb1");
chb1.setTitle("CheckBox 1");
chb1.setSummaryOn("Description of checkbox 1 on");
chb1.setSummaryOff("Description of checkbox 1 off");
rootScreen.addPreference(chb1);
ListPreference list = new ListPreference(this);
list.setKey("list");
list.setTitle("List");
list.setSummary("Description of list");
list.setEntries(R.array.entries);
list.setEntryValues(R.array.entry_values);
rootScreen.addPreference(list);
CheckBoxPreference chb2 = new CheckBoxPreference(this);
chb2.setKey("chb2");
chb2.setTitle("CheckBox 2");
chb2.setSummary("Description of checkbox 2");
rootScreen.addPreference(chb2);
PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(this);
screen.setKey("screen");
screen.setTitle("Screen");
screen.setSummary("Description of screen");
final CheckBoxPreference chb3 = new CheckBoxPreference(this);
chb3.setKey("chb3");
chb3.setTitle("CheckBox 3");
chb3.setSummary("Description of checkbox 3");
screen.addPreference(chb3);
PreferenceCategory categ1 = new PreferenceCategory(this);
categ1.setKey("categ1");
categ1.setTitle("Category 1");
categ1.setSummary("Description of category 1");
screen.addPreference(categ1);
CheckBoxPreference chb4 = new CheckBoxPreference(this);
chb4.setKey("chb4");
chb4.setTitle("CheckBox 4");
chb4.setSummary("Description of checkbox 4");
categ1.addPreference(chb4);
final PreferenceCategory categ2 = new PreferenceCategory(this);
categ2.setKey("categ2");
categ2.setTitle("Category 2");
categ2.setSummary("Description of category 2");
screen.addPreference(categ2);
CheckBoxPreference chb5 = new CheckBoxPreference(this);
chb5.setKey("chb5");
chb5.setTitle("CheckBox 5");
chb5.setSummary("Description of checkbox 5");
categ2.addPreference(chb5);
CheckBoxPreference chb6 = new CheckBoxPreference(this);
chb6.setKey("chb6");
chb6.setTitle("CheckBox 6");
chb6.setSummary("Description of checkbox 6");
categ2.addPreference(chb6);
rootScreen.addPreference(screen);
list.setDependency("chb1");
screen.setDependency("chb2");
// код из прошлого урока для связи активности categ2 и значения chb3
categ2.setEnabled(chb3.isChecked());
chb3.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
categ2.setEnabled(chb3.isChecked());
return false;
}
});
}
}
Сначала мы создаем PreferenceScreen и сообщаем Activity, что этот экран будет корневым.
Далее мы последовательно создаем Preference-элементы, присваиваем им атрибуты и добавляем детей к родителям.
В конце мы реализуем зависимости (dependency) и, как и на прошлом уроке, привязываем состояние активности категории categ2 к значению чекбокса chb3.
Метод setDependency лучше вызывать в самом конце. Иначе может быть неверное поведение элементов.
MainActivity.java:
package ru.startandroid.develop.p0741preferencescode;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem mi = menu.add(0, 1, 0, "Preferences");
mi.setIntent(new Intent(this, PrefActivity.class));
return super.onCreateOptionsMenu(menu);
}
}
Запустив приложение, вы получите экран, аналогичный экрану с предыдущего урока. Только сделан программно, а не из xml.
Кстати, вы можете не только добавлять, но и удалять Preferences-элементы. Для этого у категорий и экранов есть методы removePreference и removeAll.
На следующем уроке:
- работаем с файлами