What is a "Preference Activity" ? 

App. 등 설정에 관련된 UI 구성에 특화 되어 있는 Activity
설정 Item 구성 , Scrolling등을 지원합니다. 

Write XML Layouts

1. Activity Layout 


Class 관계를 살펴보면 PreferenceActivity는 ListActivity를 상속받는다. 
ListActivity에서 ListView를 접근할때,"@android:id/list"로 접근하기 때문에, Layout XML 작성시 유의 해야 한다. 

 <ListView android:id="@android:id/list"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_weight="1"

        android:drawSelectorOnTop="false"/>


2. Preference Items 

addPreferenceFromResource() / addPreferenceFromIntent() 등을 통해 Preference Item을 삽입
나는 addPreferenceFromResource() 를 사용하는 것을 선호한다. 


위와 같이 Preference 관련 resource를 추가 한다. 

<PreferenceScreen

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:title="@string/settings">


    <CheckBoxPreference

        android:key="alarm_in_silent_mode"

        android:title="@string/alarm_in_silent_mode_title"

        android:summary="@string/alarm_in_silent_mode_summary" />


    <VolumePreference

        android:title="@string/alarm_volume_title"

        android:summary="@string/alarm_volume_summary"

        android:dialogTitle="@string/alarm_volume_title"

        android:persistent="false"

        android:streamType="alarm" />


    <ListPreference

        android:key="snooze_duration"

        android:title="@string/snooze_duration_title"

        android:entries="@array/snooze_duration_entries"

        android:entryValues="@array/snooze_duration_values"

        android:defaultValue="10"

        android:dialogTitle="@string/snooze_duration_title" />


    <ListPreference

        android:key="volume_button_setting"

        android:title="@string/volume_button_setting_title"

        android:dialogTitle="@string/volume_button_dialog_title"

        android:entries="@array/volume_button_setting_entries"

        android:entryValues="@array/volume_button_setting_values"

        android:summary="@string/volume_button_setting_summary"

        android:defaultValue="2" />


</PreferenceScreen>


각각의 Entry는 View Entry등과 마찬가지로, Android Class와 Match 된다. 

Write your Code

1. 구현해야 할것들

다른 Activity 사용법과 마찬가지로, 만약 "Setting"화면이 필요하다고 하면,
"PreferenceActivity"를 상속받는 "SettingActivity"를 생성합니다. 

onCreate 
- addPreferenceFromResource를 통해 Preference Item을 구성
onPreferenceTreeClick
- PreferenceClick Event 처리
onPreferenceChanged
- Preference Value Change 처리

2. Source Code

 @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);

    }



    @Override

    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,

            Preference preference) {

        if (KEY_ALARM_IN_SILENT_MODE.equals(preference.getKey())) {

            CheckBoxPreference pref = (CheckBoxPreference) preference;

            int ringerModeStreamTypes = Settings.System.getInt(

                    getContentResolver(),

                    Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);


            if (pref.isChecked()) {

                ringerModeStreamTypes &= ~ALARM_STREAM_TYPE_BIT;

            } else {

                ringerModeStreamTypes |= ALARM_STREAM_TYPE_BIT;

            }


            Settings.System.putInt(getContentResolver(),

                    Settings.System.MODE_RINGER_STREAMS_AFFECTED,

                    ringerModeStreamTypes);


            return true;

        }


        return super.onPreferenceTreeClick(preferenceScreen, preference);

    }


    public boolean onPreferenceChange(Preference pref, Object newValue) {

        final ListPreference listPref = (ListPreference) pref;

        final int idx = listPref.findIndexOfValue((String) newValue);

        listPref.setSummary(listPref.getEntries()[idx]);

        return true;

    }


위의 코드는 실제로 addPreferenceFromResource를 통해서, Preference를 구성하고,
onPreferenceTreeClick을 이용하여, Preference Click 이벤트를 처리 하는 부분이다. 

이처럼 PreferenceActivity를 이용하면, 쉽게 Setting 화면을 구성할 수 있다. 


+ Recent posts