https://m.blog.naver.com/edisondl/221468737546



안녕하세요. 오늘 알아볼 것은 바로 PreferenceActivity입니다.

혹시 앱을 사용하면서 설정창 등이 리스트뷰 형태로 생긴것을 본 적이 있나요? 아래사진 처럼 말이죠.

이런것은 어떻게 만들 수 있을까요?

일단 커스텀 리스트뷰나 레이아웃으로 노가다를 한 후, 값 하나하나를 SharedPreference에 저장하고 그 값을 불러오고...

네. 복잡합니다. 진짜 저래야 되면 전 안합니다.

그러나 PreferenceActivity를 쓰면 이런 과정이 필요없이 XML파일을 하나 작성하는것 만으로도 가능합니다.

한번 자세히 알아보겠습니다.

1. PreferenceActivity를 만들기 위한 셋팅

먼저, 안드로이드 스튜디오를 킨 후, 다음과 같이 합니다.

1. res폴더에 xml이라는 이름의 폴더 생성

2. 생성한 xml폴더안에

자신이 원하는 이름으로 PreferenceActivity를 디자인 할 xml파일을 생성

네 끝입니다. 이제 2에서 생성한 xml파일에다 대고 디자인만 잘해주면 됩니다.

※저는 파일의 이름을 preferences.xml로 하였습니다.

2. 액티비티에 XML불러오기

디자인 할 xml을 만들었으면, 이제 액티비티에 이 xml파일을 연결시켜줘야 합니다. 이도 어렵지 않습니다.

1. 표시하고 싶은 액티비티에 PreferenceActivity를 상속한다.

2. 기존에 onCreate에 있던 setContentView는 꼭 지운다.(안그러면 오류발생)

3. 다음 코드를 onCreate에 추가한다.

addPreferencesFromResource(R.xml.너의PreferenceXML파일);

끝이다.

3. 본격적으로 디자인 하기

생성한 xml파일을 열어보겟습니다.

보시다시피 저런식으로 이루어져 있습니다.

저 <PreferencesScreen> </PreferencesScreen>사이에 디자인 하면 됩니다.

위는 지원하는 항목들 입니다.

몇개만 일단 살펴보겠습니다.

1. CheckBox, Ringtone, Switch

이름에서도 알다시피 각각 체크박스, 벨소리 선택, 스위치의 모습을 하고 있는 프레퍼런스들 입니다.

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:title="체크박스" /> <RingtonePreference android:title="링톤" /> <SwitchPreference android:title="스위치" /> </PreferenceScreen>

위와 같이 간단히 만들어 보았습니다. 이걸 실행시켜보면

이렇게 보이는 것을 알 수 있습니다.

간단하죠?

이제 여기에 몇가지 부가기능(?)을 더 넣어보겠습니다.

PreferenceActivity는 이렇게 디자인 된 화면을 띄우고, 사용자가 값을 변경시 이른 SharedPreference에 자동으로 저장합니다. 마찬가지로 PreferenceActivity가 다시 열렸을때 저장된 값을 알아서 가져와서 사용자가 셋팅해놓은 값을 복원합니다.

이걸 사용하려면 다음과 같이 해줍니다.

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:title="체크박스" android:summary="체크박스 입니다." android:key="checkbox" android:defaultValue="true"/> </PreferenceScreen>

뭐가 더 추가되었죠? 여기서 추가된 것들을 살펴보면...

android:title - 프레퍼런스의 텍스트 지정

android:summary - title아래의 작은 설명

android:key - SharedPreference로 저장할때 키

android:defaultValue - 기본 값

정도 입니다.

여기서 중요한것이

android:key - SharedPreference로 저장할때 키

android:defaultValue - 기본 값

입니다.

먼저 defaultValue기본값을 설정하는데, 스위치나 체크박스의 경우 true false로 지정해주면 됩니다.

android:key 네 이게 중요합니다. 사용자가 값을 변경시 변경된 값을 SharedPreference에 저장할때 사용하는 키를 지정합니다. 이게 들어가있어야 나갔다 들어와도 변경한 값이 그대로 복원됩니다.

그 외에 android:summaryOnandroid:summaryOff 가 있습니다. 이는 활성화 상태일 때, 비활성화 상태일때의 summary텍스트를 다르게 해줄 수 있습니다.

2. List

다음으로 알아볼 것은 ListPrefernece입니다. 이는 클릭시 값을 선택할 수 있는 리스트가 있는 다이얼로그를 보여줍니다.

먼저, 리스트를 설정하기 위해서는 해야할게 있는데요,

1. res/values 폴더 안array.xml파일 생성

2. 생성한 array파일에 리스트 지정

입니다. 별로 어렵지 않죠?

값을 설정하는건 다음과 같은 식으로 추가하면 됩니다.

<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="language"> <item>한국어</item> <item>English</item> </string-array> <string-array name="language_value"> <item>ko</item> <item>en</item> </string-array> </resources>

보시면 하나의 리스트를 띄우는데 두개의 array가 필요합니다. 이유가 뭘까요?

바로 한개는 사용자에게 보여줄 리스트, 다른 한개는 실제로 SharedPreference에 저장될 값 입니다.

저는 위 코드를 보면 보여줄것은 name을 language로, 저장될 값의 name은 language_value로 해보았습니다.

이제 Preference디자인 xml로 돌아가서 저것들을 추가해주겠습니다.

<ListPreference android:title="언어" android:summary="언어설정 입니다." android:key="language" android:defaultValue="ko" android:entries="@array/language" android:entryValues="@array/language_value" android:negativeButtonText="@null" android:positiveButtonText="@null"/>

뭔가 더 많이 추가되었죠?

android:defaultValue - 리스트를 처음 열었을때, 기본으로 선택되어있을 값입니다. SharedPreference에 저장되는 값으로 지정해 줍니다.

android:entries - 사용자에게 보여줄 값의 리스트를 지정합니다.

android:entryValues - SharedPreference에 저장될 값의 리스트를 지정합니다.

android:negativeButtonText - 다이얼로그의 버튼텍스트를 지정합니다. 지정하지않으려면 @null을 입력.

android:positiveButtonText - 다이얼로그의 버튼텍스트를 지정합니다. 지정하지않으려면 @null을 입력.

간단하죠?

3. EditText

아시겠죠? 말그대로 EditText다이얼로그를 띄워주는 용도로 사용됩니다. 간단히 알아보죠.

<EditTextPreference android:title="텍스트입력" android:summary="텍스트입력 입니다." android:defaultValue="test" android:key="backup"/>

다른것들이랑 별반 다를게 없습니다.

참고로 이건 android:negativeButtonText같은걸 지정안해도 기본적으로 버튼 텍스트가 나오는 점 참고하시기 바랍니다.

4. Preference

말 그대로 기본 프레퍼런스 입니다. 버튼대용으로 쓸 수 있습니다. 물론 java코드로 이벤트를 추가해서 말이죠.

<Preference android:title="기본"> </Preference>

그 외 간단히 intent같은건 xml내에서 바로 지정가능합니다.

<Preference android:title="기본"> <intent android:action="android.intent.action.VIEW" android:data="http://www.naver.com"/> </Preference>

이렇게 간단한 Intetn는 xml내에서 처리가 가능합니다.

4. 활성화/비활성화 하기

설정 기능을 만들다 보면은 어떤 기능이 켜져있어야만 다른 기능도 켜지도록 하는것을 만들어야 할 때가 있습니다. 아래처럼 말이죠.

 

이것도 아주 간단합니다. 다음과 같이 해주면 됩니다.

<CheckBoxPreference android:title="백업" android:summary="백업합니다." android:defaultValue="false" android:key="backup" /> <Preference android:title="백업 주기" android:summary="백업 주기를 설정합니다. 시간으로 지정시, 앱이 백그라운드에서 동작합니다" android:key="bu" android:dependency="backup"/>

추가된 부분은 android:dependency 입니다. 이 부분을 비활성화 될 부분에 넣고, 값으로는 다른 것의 key를 넣으면 됩니다.

즉, 위 코드는 Preference의 android:dependency를 CheckBoxPreference의 key와 같게 해두었습니다.

이제 체크박스가 체크되면 Preference가 활성화됩니다. 아래처럼요

 

5. 카테고리 설정

PreferenceActivity는 카테고리를 설정하는 것도 가능합니다.

다음과 같이 한 카테고리에 넣을 Preference들을 다음 태그로 묶으면 됩니다.

<PreferenceCategory android:title="카테고리 이름"> //...여기에 Preference들을 넣기 </PreferenceCategory>

5. java코드로 처리하기

이 부분은 필수가 아닙니다.

이번에는 사용자가 값을 선택했을 때, 변경 여부를 감지하거나 Preference를 클릭시 이벤트 처리등을 해보겠습니다.

1. 값 변경 감지

이것은 사용자가 값을 변경했을 때를 감지하는 것 입니다. 정확히 말해서는 사용자가 Preference를 변경 시 SharedPreference의 값이 바뀌는 것을 감지하는 것 입니다.

SharedPreferences prefs; prefs = PreferenceManager.getDefaultSharedPreferences(this); prefs .registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged(SharedPreferences sp, String key) { Log.d("tag","클릭된 Preference의 key는 "+key); } }); }

위 코드를 onCreate안에 넣으시면 됩니다. 변경된 Prefernece의 key는 변수 key로 가져올 수 있습니다.

하지만 일반 Preference의 key는 가져오지 못하는 것을 볼 수 있습니다.

2. Prefernece클릭 감지

Preference의 클릭을 감지합니다. 보통 일반 Preference를 버튼대용으로 쓰기 위해 사용합니다.

@Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { String key = preference.getKey(); Log.d("tag","클릭된 Preference의 key는 "+key); return false; }

위와 같이 하면 일반 Preference의 클릭여부도 가져올 수 있다.

예제 파일

https://github.com/semicolon3253/PreferenceExample

와 깃허브 올리는거 복잡하다...