기본 콘텐츠로 건너뛰기

Android 어플리케이션에 Settings (설정) 기능을 어떻게 구현할까?

본 글은 Android Settings 페이지를 참고로 작성되었습니다.

Android Application을 만들다 보면 설정 화면이 필요합니다.

어떻게 할 수 있을 까요?


  1. 간단히 SettingsActivity를 생성하고 
  2. 여기에 필요에 따라 EditText, ListView, Button, CheckBox 등의 View를 그려주면 됩니다.
  3. 그리고 각 View Event를 구현하고
  4. 변경된 값을 File, SharedPreference, 혹은 Database 등에 저장해주면 됩니다.


그런데 Android에서는 좀더 스마트한 방법을 제공해주고 있습니다.
바로 Preference 입니다.

설정 화면을 만들기 위해 위와 같이 View를 직접 그리는 대신,
Preference와 그 SubClass들을 XML에 정의하여 만들 수 있습니다.

일반적으로 설정 화면은 ListView로 보여지는데요.
이때 각 List 하나의 항목 당 하나의 설정 값을 저장/변경/관리하게 됩니다.
그리고 앞서 언급한 Preference 객체가 바로 이 하나의 설정 항목에 해당됩니다.

즉 5개의 설정을 관리할 수 있는 설정 화면을 위해서는 5개의 Preference 객체가 필요하다는 거죠.

Preference에는 대표적으로 다음과 같은 SubClass들이 있습니다.
  • CheckBoxPreference
  • EditTextPreference
  • ListPreference
각 이름을 보시면 어떤 설정 메뉴를 만들 수 있는지 알 수 있을 겁니다.

Preference는 key-value 쌍으로 설정 값을 저장하며,
그 저장 값은 SharedPreference에 저장됩니다.

사용자가 설정 값을 변경하면 시스템은 그 값을 SharedPreference에 업데이트하므로
설정 값을 저장하기 위해 개발자가 직접 SharedPreference에 접근할 필요는 없습니다.
오직 설정 값을 읽어 적합한 UI를 그리거나 데이터를 보여주기 위해서만 
SharedPreference 에 접근하여 Read하면 됩니다.

Preference가 설정 값을 저장하기 위해 SharedPreference를 사용하지만
본 글은 Preference에 대한 내용을 위한 글이므로 SharedPreference에 대한 자세한 내용은 여기를 참조하시기 바랍니다.

위에서도 소개했듯이 Preference는 일반적인 방식(View를 통해)으로 UI를 그리지 않습니다.
그렇기 때문에 특별한 Activity나 Fragment를 통해 구현해야 합니다.
이는 다시 개발하는 앱이 지원하는 Android 버전에 따라 나뉘는데요.


  • Android 3.0 이전 버전을 지원한다면 PreferenceActivity를 상속받아야 하고
  • 그 이후 버전을 지원한다면 PreferenceFragment를 상속받아 구현하면 됩니다.
    (단 태블릿 환경과 같이 2-패널 레이아웃을 고려한다면 PreferenceActivity를 사용할 수 있습니다.
XML에 Preference 정의하기
UI에 보여줄 Preference들을 XML에 정의해야 합니다.
  1. 먼저 "res" 디렉토리에 "xml" 이름으로 디렉토리를 생성합니다.
  2. res/xml 안에 원하는 preference xml 파일을 생성합니다.
    (일반적으로 preference.xml 와 같이 생성합니다.)
  3. 생성한 xml 파일을 열어 원하는 Preference를 추가합니다.
생성한 XML 파일을 열어보면 아래와 같이 <PreferenceScreen> 을 root 하여 만들어진 것을 확인할 수 있습니다.


<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

</PreferenceScreen>

<PreferenceScreen> 안에 원하는 Preference의 subClass들을 추가해주면 됩니다.

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="pref_sync"
        android:title="@string/pref_sync"
        android:summary="@string/pref_sync_summ"
        android:defaultValue="true" />
    <ListPreference
        android:dependency="pref_sync"
        android:key="pref_syncConnectionType"
        android:title="@string/pref_syncConnectionType"
        android:dialogTitle="@string/pref_syncConnectionType"
        android:entries="@array/pref_syncConnectionTypes_entries"
        android:entryValues="@array/pref_syncConnectionTypes_values"
        android:defaultValue="@string/pref_syncConnectionTypes_default" />
</PreferenceScreen>

Preference XML Attribute들 중 핵심이 되는 것을 보면 다음과 같습니다.
  • key: SharedPreference에 저장될 key 값
  • title: 사용자에게 보여질 설정의 이름
  • defaultValue: 초기 값

XML을 정의했으니 이제 Activity/Fragment를 생성할 차례입니다.
여기서는 Android 3.0 이상을 지원하는 PreferenceFragment를 통해 생성하도록 하겠습니다.
다음과 같이 PreferenceFragment를 상속받아 SettingsFragment를 정의합니다.
중요한 부분은 addPreferencesFromResource() 부분입니다.
위에서 정의한 XML 파일을 불러오고 있습니다.

public static class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
    ...
}

이제 사용자가 변경한 설정 값을 읽어와 적합한 UI를 그려야할 텐데요.
Preference 값을 읽어오는 것은 다음과 같습니다.

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String syncConnPref = sharedPref.getString(SettingsActivity.KEY_PREF_SYNC_CONN, "");


댓글

이 블로그의 인기 게시물

미니 메추리 키우기 - 사육장 만들기

미니 메추리는 우리가 알고 있는 일반 메추리보다 조금 작은 개체입니다. 버튼퀼(버튼퀘일)이라고도 불리죠. 일반 메추리보다 작기도 하고 짝이 맞는 암수가 같이 있으면 그리 시끄럽지도 않습니다. 여러 모로 키우기가 좀더 수월하죠. 첫 번째 단계로 먼저 아이들이 지낼 집을 만들어 주었습니다. 사실 여러 고민을 많이 했어요 지금 소개하는 집을 만들기 전에는 120L 짜리 대형 리빙 박스로 집을 만들어 주었었죠. 값이 저렴하고 개량하는 것이 크게 어렵지 않기 때문에 많은 분들이 리빙 박스를 개조하여 집을 만들어 주고 있어요. 저 같은 경우는 보온을 생각해서 안쪽에는 단열재를 덧대기도 했죠. 하지만 사실 리빙 박스로 집을 만드는게 아주 쉽지만은 않아요. 물론 있는 그대로를 사용하신다면 어려울 건 전혀 없죠. 그런데 만약 전구를 달기 위해 구멍을 뚫거나, 환기 구멍을 뚫거나 기타 여러 필요에 의해 리빙 박스를 뜯어 고쳐야 한다면 이야기가 달라지죠. 저도 사실 이런 불편함에 고민고민을 하다가 오늘 소개해 드릴 두 번째 집과 같은 것을 생각하게 되었어요. 바로 시중에서 쉽게 구할 수 있는 종이 박스를 활용한 것인데요. 위쪽 뚜껑에는 구멍을 두 개를 뚫었어요. 작은 구멍은 온도 조절을 위한 전구 바로 위쪽으로 온도가 너무 올라갈 경우 온도 조절을 위해 뚫어 놓았고요.  아래 좀더 큰 구멍은 물, 먹이 등을 교체해주기 위한 구멍이에요.  정면에는 창을 내어 관찰할 수 있게 했어요. 지금은 저 가운데도 잘라내서 크게 창 하나로 만들었어요. 안쪽에는 온도계를 비치하여 내부 온도를 확인할 수 있게 해두었습니다. (지금 생각해보니 전구 바로 아래쪽에 위치한 탓에 제대로 된 온도 측정이 될지 모르겠네요;;;) 그리고 보셔서 아시겠지만, 내부 ...

[메추리 키우기] 스티로폼으로 정말 쉽게 부화기 만들기

미니 메추리 한 쌍을 기르고 나서는  거의 4일에 3번 정도 알을 낳고 있습니다. 가끔 휴란기를 짧게 짧게 갖는 경우도 있고요. 그 알 들이 처치 곤란이기도 하고, 부화시키는 것도 해보고 싶어서 부화기를 만들어야지.. 했는데  그놈의 스티로폼 박스를 구하지 못해 차일피일 미루고 있었습니다. 그러다 요 근래  같이 사는 순둥이와 오전 산책 중에 집 근처에 버려져 있는 박스를 발견했어요 ㅎㅎ (요놈이 순둥이 입니다 ㅎㅎ) 바로 들고 왔죠! 일단 물과 솔로 박박 닦아줬어요. 그리고 온도 조절을 위한 전구! 10w 정도로 샀는데, 일단 지금 쓰기에는 충분한 것 같아요. 관련 카페에서는 10w 2개를 쓰라고도 하는데요. 혹시 사용하다가 1개가 나가버리는 사고를 미연에 방지하기 위함입니다. 일단 저는 1개만 달았어요. 간단히 그냥 스티로폼 옆에 칼 집을 약간 내어서 선을 끼웠습니다. 참 대충 했죠 -0- 그리고 또 중요한 것. 바로 전란인데요. 간단히 알을 굴려주는 거라고 보면 될 것 같습니다. 알을 굴려주지 않으면  사람으로 치면 가만히 요지부동으로 누워있는 거라고 보시면 되겠는데요. 이럴 경우 알 속의 배아가 튼튼하게 정상적으로 자라지 못한다고 합니다. 그래서 실제 야생에서도 어미 새가 굴리기도 하고 뒤척인다고 해요. 나무젓가락과 돌아다니는 박스를 조금 잘라 어설프게 만들었습니다;;; 정말 대충 만들었죠;;; 처음에는 알들을 몇개 넣어둔 뒤 뚜껑을 완전히 덮었는데요. 온도를 측정해보니 40도 까지 올라가더군요. 적정 온도는 37~39도 정도라고 해서 일단 살짝 열어두니 온도 조절이 조금 되는 상황입니다. 물통은 습도 조절을 위해 넣어두었...

미니 메추리 키우기 - 사육장 확장

커다란 리빙 박스에서 상당히 작은 종이 박스로 집을 이사하고는 괜히 미안하더라고요. 터무늬 없이 좁아진 집... 제대로 날지도 자연을 느끼지도 못하는 불쌍한 녀석들인데 집까지 강제로 좁은 집으로...... 그래서 확장 공사를 진행하였습니다. 지난 번 종이 박스를 혹시 몰라 2개를 구입했었는데요. 때마침 이렇게 확장 공사를 할 수 있게 되었네요. 기존 종이 박스 사육장 옆에 바로 붙여서 2배 사이즈 Up을 하였습니다. 중간에 넘나들 수 있도록 잘라주었어요. 사실 처음 의도했던 것은 먹이가 있는 곳에는 흙을 넣지 않으려고 했어요. 흙이 있고 그 위에 사료통을 넣어두니 녀석들이 흙 위에서 난리 부르스를 떨면 사료가 흙으로 뒤덮여서 먹을 수가 없게 되더라고요. 그런데 막상 이어 붙여 만들다 보니 양쪽 흙을 안 놓을 수가 없더군요. 대신 위에 보시는 것처럼 사료통을 살짝 공중에 띄워놔서 흙이 덮여지지 않게끔 했어요.    못보던 공간을 발견하고는 과감한 암컷이 먼저 기웃댑니다. 암컷이 먼저 들어간 것 확인하고는 수컷이 뒤따라 들어가네요. 종이 박스로 하다 보니 확실히 사육장의 개조/가공은 쉽습니다. 일반 커터칼로 창을 내고, 종이 박스를 서로 붙이거나 할 수 있죠. 대신 방수가 되지 않는 단점이 있어요. 저 같은 경우는 안쪽에 단열재?같은 것을 붙이고 흙을 깔아둬서 물을 들이 붓지 않는 이상은 쓰는데 큰 지장은 없습니다.