В этом уроке:
- создаем экран настроек программно
На прошлых уроках мы создавали экран настроек из 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.
На следующем уроке:
- работаем с файлами
Присоединяйтесь к нам в Telegram:
- в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня