안드로이드 프로그래밍을 하다보면 설정 액티비티를 만들어야 할때가 있습니다.
설정 액티비티들은 리스트로 구성되어있죠.
리스트를 컨버팅하면서 만든다고 해도, 
텍스트만 나오는 row가 있고, 체크박스고 혼재된 row, 입력창이 들어가야하는  row가 있을 수 있습니다.
이럴때 편하게 사용할 수 있는 방법이 있습니다.

바로 PreferenceActivity 를 상속받아서 만드는것이지요.





보통은 아래의 화면처럼 나옵니다.
분류별 항목별로 묶어 분류바를 기준으로 여러 설정들이 보여지죠.
기본적으로는 텍스트, 큰텍스트와 그 밑의 작은 텍스트, 거기에 더해진 체크박스 입니다.

 
 
 
 


사실 직접 이런 화면을 구성해도 되지만, 
특별히 월등한 UI를 제공하고자 하는 목적이 아니라면 쓰라고 있는 기능을 쓰는것이 빠르고 편리합니다.


PreferenceActivity를 사용하기 위해서는 두가지 단계를 거쳐야합니다. 
 1. 레이아웃 작성
 2. 액티비티 작성

사실 일반적인 액티비티들도 모두 레이아웃을 작성하고 액티비티를 작성하기 때문에 그렇게 어렵게 느껴지진 않습니다.
다만, 화면에 어떻게 보여질지, 어떻게 배치할지에 대한 부분을 배제하고 xml레이아웃을 작성할 수 있기때문에 이 방법은 직접 설정 xml레이아웃을 작성하는것보다 빠르고 월등합니다.


 1. 레이아웃 작성

PreferenceActivity에 사용되는 Layout xml은 일반 Activity에 사용하는 xml 과 작성법이 조금 다릅니다.
일반 액티비티에 사용하는 default layout이 LinearLayout 이라면, 
Preference 액티비티에 사용하는 default layout은 PreferenceScreen 입니다.

PreferenceScreen을 기본으로 하는 Layout XML 파일의 작성은 아래와 같이 할 수 있습니다.


PreferenceActivity에 사용할 xml 파일 생성
 
 
 
 


파일을 생성했으면 이제 작성할 차례입니다.

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
     
</PreferenceScreen>

위와같은 코드가 작성되어있습니다.
이제 여기에 필요한 기능들을 추가로 작성합니다.

PreferenceScreen 태그 안에는,
복수의 PreferenceCategory가 들어갈 수 있습니다.
또 PreferenceCategory 안에는 복수의 Preference들이 들어갈 수 있습니다.




이 Preference의 태그의 속성들은 간단하게는, 
"키(KEY)"와 "타이틀(TITLE)" / "키(KEY)"와 "타이틀(TITLE)", 그리고 "값(VALUE)"로 이루어져있습니다.
다른 속성들이 많이 있지만, 이것들만 사용해도 어렵지 않게 설정의 기능들을 구현해 낼 수 있습니다.

저는 간단하게 텍스트로 이루어진 카테고리와, 체크박스로 이루어진 카테고리를 추가해 설정 화면을 만들어보려고 합니다.
결과적으로는 아래와 같은 화면을 만들 수 있습니다.

 
 

안드로이드에서 제공해주는 것만으로도 이렇게 그럴듯한 설정화면을 만들었습니다.

이 설정 화면의 XML 코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    android:key="setting_activity_top_title"
    android:title="설정  - http://croute.me/340">
     
    <!-- 설정를 구성하는 Layout XML -->
    <!-- @author croute -->
    <!-- @since 2011.02.25 -->
     
    <PreferenceCategory
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:key="setting_activity_account"
        android:title="어플리케이션 정보">
        <Preference
            android:key="setting_activity_id"
            android:title="어플케이션 이름"
            android:selectable="true" />
        <Preference
            android:key="setting_activity_app_version"
            android:title="어플리케이션 버전"      
            android:selectable="true" />
    </PreferenceCategory>
     
    <PreferenceCategory
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:key="setting_activity_pushalarm"
        android:title="알림 설정">
        <CheckBoxPreference
            android:key="setting_activity_autoalarm"
            android:title="자동알림"
            android:summary="어플리케이션 알림이 종료된 경우 자동으로 재실행"
            android:defaultValue="true"/>
        <CheckBoxPreference
            android:key="setting_activity_alarm_reiceive"
            android:title="알림설정" android:defaultValue="true"/>
    </PreferenceCategory>
     
</PreferenceScreen>

눈여겨 볼점은 Preference를 두가지 사용했다는 것.
키와 타이틀을 지정했다는 것입니다.

여기서는 간단한 화면을 구성하기 위해 Preference와 CheckBoxPreference만을 사용했지만, 
(실제로는 EdittextPreference, ListPreference 등 많은 Preference가 있습니다.)





 2. 액티비티 작성

이제 액티비티로 가봅니다.

PreferenceActivity를 처음작성할 때 달라진 부분은 하나뿐입니다.

보통의 Activity에서 레이아웃을 설정할 때 setContentView(R.layout.파일이름)으로 설정한다면,
PreferenceActivity는 레이아웃을 설정할 때 addPreferencesFromResource(R.layout.파일이름)과 같이 합니다.

setContentView -> addPreferenceFromResource

이렇게 바뀐 것 빼고는 액티비티의 기본 설정에서 크게 달라진것은 없습니다.

화면만 보여주기 위해서 액티비티는 아래와 같이 작성하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package me.croute.preferenceactivity;
 
import android.os.Bundle;
import android.preference.PreferenceActivity;
 
 
public class PreferenceActivityExample extends PreferenceActivity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.layout.preference_activity_example);
    }
}

하지만 화면만 보여주는 어플리케이션은 없기때문에 이제부터 체크박스 체크/해제에 따른 이벤트 처리,
어플리케이션 이름등을 클릭했을때의 이벤트 처리에 대해서 알아보도록 하겠습니다.


일반적인 Activity라면 클릭이벤트를 OnClickListener로 받습니다.
하지만 PreferenceActivity는 클릭이벤트를 OnPreferenceClickListener로 받아야 합니다.
일반적인 클릭이 아닌, Preference에 대한 클릭이기 때문입니다.


클릭이벤트는 아래와 같이 구현할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package me.croute.preferenceactivity;
 
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
 
public class PreferenceActivityExample extends PreferenceActivity implements OnPreferenceClickListener
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.layout.preference_activity_example);
         
        Preference pAppName = (Preference)findPreference("setting_activity_id");
        Preference pAppVersion = (Preference)findPreference("setting_activity_app_version");
        CheckBoxPreference cbpAutoAlarm = (CheckBoxPreference)findPreference("setting_activity_autoalarm");
        CheckBoxPreference cbpAlarmReceive = (CheckBoxPreference)findPreference("setting_activity_alarm_reiceive");
         
        pAppName.setOnPreferenceClickListener(this);
        pAppVersion.setOnPreferenceClickListener(this);
        cbpAutoAlarm.setOnPreferenceClickListener(this);
        cbpAlarmReceive.setOnPreferenceClickListener(this);
    }
 
    @Override
    public boolean onPreferenceClick(Preference preference)
    {
        // 어플리케이션 이름
        if(preference.getKey().equals("setting_activity_id"))
        {
        }
        // 어플리케이션 버전
        else if(preference.getKey().equals("setting_activity_app_version"))
        {
        }
        // 자동알림
        else if(preference.getKey().equals("setting_activity_autoalarm"))
        {
        }
        // 알림 받기
        else if(preference.getKey().equals("setting_activity_alarm_reiceive"))
        {
        }
        return false;
    }
}

여기서 한가지 주의할점은 Preference의 CheckBoxPreference는 자동으로 체크됨을 잡아내서 자신의 상태를 변경합니다.
(기존의 Activity에서 체크박스를 사용하듯이 하면, 체크 되있던걸 돌리고, 체크 안되야 하는걸 체크하는 사태가 일어납니다.)

구현은 여기까지면 충분히 기본적인 설정의 기능들을 사용할 수 있습니다.

이제 클릭이벤트에 각자에 맞는 기능들을 추가해주면됩니다.



+ Recent posts