В этом уроке:

- создаем экран настроек программно

 

На прошлых уроках мы создавали экран настроек из 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 

- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня




Language

Автор сайта

Дмитрий Виноградов

Подробнее можно посмотреть или почитать.

Никакие другие люди не имеют к этому сайту никакого отношения и просто занимаются плагиатом.

Социальные сети

 

В канале я публикую ссылки на интересные и полезные статьи по Android

В чате можно обсудить вопросы и проблемы, возникающие при разработке



Группа ВКонтакте



Поддержка проекта

Яндекс
410011180491924

WebMoney
R248743991365
Z551306702056

Paypal