본 글은 Android Settings 페이지를 참고로 작성되었습니다.
Android Application을 만들다 보면 설정 화면이 필요합니다.
어떻게 할 수 있을 까요?
그런데 Android에서는 좀더 스마트한 방법을 제공해주고 있습니다.
바로 Preference 입니다.
설정 화면을 만들기 위해 위와 같이 View를 직접 그리는 대신,
Preference와 그 SubClass들을 XML에 정의하여 만들 수 있습니다.
일반적으로 설정 화면은 ListView로 보여지는데요.
이때 각 List 하나의 항목 당 하나의 설정 값을 저장/변경/관리하게 됩니다.
그리고 앞서 언급한 Preference 객체가 바로 이 하나의 설정 항목에 해당됩니다.
즉 5개의 설정을 관리할 수 있는 설정 화면을 위해서는 5개의 Preference 객체가 필요하다는 거죠.
Preference에는 대표적으로 다음과 같은 SubClass들이 있습니다.
Android Application을 만들다 보면 설정 화면이 필요합니다.
어떻게 할 수 있을 까요?
- 간단히 SettingsActivity를 생성하고
- 여기에 필요에 따라 EditText, ListView, Button, CheckBox 등의 View를 그려주면 됩니다.
- 그리고 각 View Event를 구현하고
- 변경된 값을 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 버전에 따라 나뉘는데요.
본 글은 Preference에 대한 내용을 위한 글이므로 SharedPreference에 대한 자세한 내용은 여기를 참조하시기 바랍니다.
위에서도 소개했듯이 Preference는 일반적인 방식(View를 통해)으로 UI를 그리지 않습니다.
그렇기 때문에 특별한 Activity나 Fragment를 통해 구현해야 합니다.
이는 다시 개발하는 앱이 지원하는 Android 버전에 따라 나뉘는데요.
- Android 3.0 이전 버전을 지원한다면 PreferenceActivity를 상속받아야 하고
- 그 이후 버전을 지원한다면 PreferenceFragment를 상속받아 구현하면 됩니다.
(단 태블릿 환경과 같이 2-패널 레이아웃을 고려한다면 PreferenceActivity를 사용할 수 있습니다.
XML에 Preference 정의하기
UI에 보여줄 Preference들을 XML에 정의해야 합니다.
- 먼저 "res" 디렉토리에 "xml" 이름으로 디렉토리를 생성합니다.
- res/xml 안에 원하는 preference xml 파일을 생성합니다.
(일반적으로 preference.xml 와 같이 생성합니다.) - 생성한 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, "");
댓글
댓글 쓰기