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에 추가한다.
끝이다.
3. 본격적으로 디자인 하기
생성한 xml파일을 열어보겟습니다.
보시다시피 저런식으로 이루어져 있습니다.
저 <PreferencesScreen> </PreferencesScreen>사이에 디자인 하면 됩니다.
위는 지원하는 항목들 입니다.
몇개만 일단 살펴보겠습니다.
1. CheckBox, Ringtone, Switch
이름에서도 알다시피 각각 체크박스, 벨소리 선택, 스위치의 모습을 하고 있는 프레퍼런스들 입니다.
위와 같이 간단히 만들어 보았습니다. 이걸 실행시켜보면
이렇게 보이는 것을 알 수 있습니다.
간단하죠?
이제 여기에 몇가지 부가기능(?)을 더 넣어보겠습니다.
PreferenceActivity는 이렇게 디자인 된 화면을 띄우고, 사용자가 값을 변경시 이른 SharedPreference에 자동으로 저장합니다. 마찬가지로 PreferenceActivity가 다시 열렸을때 저장된 값을 알아서 가져와서 사용자가 셋팅해놓은 값을 복원합니다.
이걸 사용하려면 다음과 같이 해줍니다.
뭐가 더 추가되었죠? 여기서 추가된 것들을 살펴보면...
android:title - 프레퍼런스의 텍스트 지정
android:summary - title아래의 작은 설명
android:key - SharedPreference로 저장할때 키
android:defaultValue - 기본 값
정도 입니다.
여기서 중요한것이
android:key - SharedPreference로 저장할때 키
android:defaultValue - 기본 값
입니다.
먼저 defaultValue는 기본값을 설정하는데, 스위치나 체크박스의 경우 true나 false로 지정해주면 됩니다.
android:key 네 이게 중요합니다. 사용자가 값을 변경시 변경된 값을 SharedPreference에 저장할때 사용하는 키를 지정합니다. 이게 들어가있어야 나갔다 들어와도 변경한 값이 그대로 복원됩니다.
그 외에 android:summaryOn과 android:summaryOff 가 있습니다. 이는 활성화 상태일 때, 비활성화 상태일때의 summary텍스트를 다르게 해줄 수 있습니다.
2. List
다음으로 알아볼 것은 ListPrefernece입니다. 이는 클릭시 값을 선택할 수 있는 리스트가 있는 다이얼로그를 보여줍니다.
먼저, 리스트를 설정하기 위해서는 해야할게 있는데요,
1. res/values 폴더 안에 array.xml파일 생성
2. 생성한 array파일에 리스트 지정
입니다. 별로 어렵지 않죠?
값을 설정하는건 다음과 같은 식으로 추가하면 됩니다.
보시면 하나의 리스트를 띄우는데 두개의 array가 필요합니다. 이유가 뭘까요?
바로 한개는 사용자에게 보여줄 리스트, 다른 한개는 실제로 SharedPreference에 저장될 값 입니다.
저는 위 코드를 보면 보여줄것은 name을 language로, 저장될 값의 name은 language_value로 해보았습니다.
이제 Preference디자인 xml로 돌아가서 저것들을 추가해주겠습니다.
뭔가 더 많이 추가되었죠?
android:defaultValue - 리스트를 처음 열었을때, 기본으로 선택되어있을 값입니다. SharedPreference에 저장되는 값으로 지정해 줍니다.
android:entries - 사용자에게 보여줄 값의 리스트를 지정합니다.
android:entryValues - SharedPreference에 저장될 값의 리스트를 지정합니다.
android:negativeButtonText - 다이얼로그의 버튼텍스트를 지정합니다. 지정하지않으려면 @null을 입력.
android:positiveButtonText - 다이얼로그의 버튼텍스트를 지정합니다. 지정하지않으려면 @null을 입력.
간단하죠?
3. EditText
아시겠죠? 말그대로 EditText다이얼로그를 띄워주는 용도로 사용됩니다. 간단히 알아보죠.
다른것들이랑 별반 다를게 없습니다.
참고로 이건 android:negativeButtonText같은걸 지정안해도 기본적으로 버튼 텍스트가 나오는 점 참고하시기 바랍니다.
4. Preference
말 그대로 기본 프레퍼런스 입니다. 버튼대용으로 쓸 수 있습니다. 물론 java코드로 이벤트를 추가해서 말이죠.
그 외 간단히 intent같은건 xml내에서 바로 지정가능합니다.
이렇게 간단한 Intetn는 xml내에서 처리가 가능합니다.
4. 활성화/비활성화 하기
설정 기능을 만들다 보면은 어떤 기능이 켜져있어야만 다른 기능도 켜지도록 하는것을 만들어야 할 때가 있습니다. 아래처럼 말이죠.
이것도 아주 간단합니다. 다음과 같이 해주면 됩니다.
추가된 부분은 android:dependency 입니다. 이 부분을 비활성화 될 부분에 넣고, 값으로는 다른 것의 key를 넣으면 됩니다.
즉, 위 코드는 Preference의 android:dependency를 CheckBoxPreference의 key와 같게 해두었습니다.
이제 체크박스가 체크되면 Preference가 활성화됩니다. 아래처럼요
5. 카테고리 설정
PreferenceActivity는 카테고리를 설정하는 것도 가능합니다.
다음과 같이 한 카테고리에 넣을 Preference들을 다음 태그로 묶으면 됩니다.
5. java코드로 처리하기
이 부분은 필수가 아닙니다.
이번에는 사용자가 값을 선택했을 때, 변경 여부를 감지하거나 Preference를 클릭시 이벤트 처리등을 해보겠습니다.
1. 값 변경 감지
이것은 사용자가 값을 변경했을 때를 감지하는 것 입니다. 정확히 말해서는 사용자가 Preference를 변경 시 SharedPreference의 값이 바뀌는 것을 감지하는 것 입니다.
위 코드를 onCreate안에 넣으시면 됩니다. 변경된 Prefernece의 key는 변수 key로 가져올 수 있습니다.
하지만 일반 Preference의 key는 가져오지 못하는 것을 볼 수 있습니다.
2. Prefernece클릭 감지
Preference의 클릭을 감지합니다. 보통 일반 Preference를 버튼대용으로 쓰기 위해 사용합니다.
와 깃허브 올리는거 복잡하다...