Урок 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.


На следующем уроке:

- работаем с файлами