본문 바로가기

안드로이드/라이브러리 써보기

[안드로이드] Setting Preference 사용하기 (Java)

SettingPreference

***

Basis

오늘은 안드로이드 앱을 만들 때 자주 접하게 될 settingPreference에 대하여 정리했다.
settingPreference는 Activity외에 다른 xml로 setting에 대한 메뉴를 먼저 정의해준다.
그 정의를 fragment로 불러들여와서 표현하는 형식이 바로 settingPreference다.

deprecated

내가 쓰던 Preference는 deprecated되었다. API level 29에서 버려졌다. 마음이 아프다. 그래도 Use the AndroiX Preference Library라고 명시해주며, 대안책을 내놓았다. 갓글

이미지출처 : PreferenceScreen Android reference, 내 노트북 안드로이드 스튜디오

1.implementation 추가하기

기존의 Preference가 deprecated되면서 androidx의 preference를 사용해야 된다. 이를 위해서는 앱수준의 gradle(build.gradle(Module:app)에 dependencies를 추가해준다. 
1
implementation 'androidx.preference:preference:1.1.0-rc01'
cs

2. setting_preference.xml 만들기

사진과 같이 res에 xml 디렉토리를 하나 만들어서 settings_preference.xml을 만들어 원하는 기능을 추가한다.
여기서는 CheckBox, EditText, List, 의존성 기능을 넣었다. (파일 이름은 달라도 상관 없어요)
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
<?xml version="1.0" encoding="utf-8"?>
 
<androidx.preference.PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
 
    <androidx.preference.PreferenceCategory android:title="설정">
 
        <androidx.preference.CheckBoxPreference
            android:defaultValue="true"
            android:key="key_chk_box"
            android:summary="Check Box Summary"
            android:title="Check Box Title" />
        <androidx.preference.EditTextPreference
            android:defaultValue="test"
            android:key="key_edit_text"
            android:summary="EditText summary"
            android:title="EditText Title" />
 
        <androidx.preference.ListPreference
            android:defaultValue="ko"
            android:entries="@array/language"
            android:entryValues="@array/language_value"
            android:key="key_language"
            android:negativeButtonText="@null"
            android:positiveButtonText="@null"
            android:summary="List summary"
            android:title="List Title" />
 
        <androidx.preference.PreferenceCategory>
 
            <androidx.preference.CheckBoxPreference
                android:defaultValue="false"
                android:key="key_dependent"
                android:summary="summary"
                android:title="dependency test" />
 
            <Preference
                android:dependency="key_dependent"
                android:key="key_dependent_child"
                android:summary="test2 summary"
                android:title="dependency test2" />
 
        </androidx.preference.PreferenceCategory>
 
 
    </androidx.preference.PreferenceCategory>
 
 
</androidx.preference.PreferenceScreen>
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<androidx.preference.PreferenceCategory>
 
            <androidx.preference.CheckBoxPreference
                android:defaultValue="false"
                android:key="key_dependent"
                android:summary="summary"
                android:title="dependency test" />
 
            <Preference
                android:dependency="key_dependent"
                android:key="key_dependent_child"
                android:summary="test2 summary"
                android:title="dependency test2" />
 
<androidx.preference.PreferenceCategory>
cs

이 부분은 CheckBox가 체크되면 활성화 되는 부분으로서, dependency 속성이 추가된다.

2.1 ListPreference 리스트 추가하기

앞서 settings_preference.xml에서 ListPreference를 썼는데, 그렇다면 해당 ListPreference를 클릭하면 List가 뜨게 하기위하여 List를 만들어보자. 먼저 values에 array.xml을 하나 추가한다. 아래 사진처럼

그 다음 array.xml에 원하는 array를 작성해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="language">
        <item>Korean</item>
        <item>English</item>
        <item>Chinese</item>
    </string-array>
 
    <string-array name="language_value">
        <item>ko-kr</item>
        <item>eng</item>
        <item>chin</item>
    </string-array>
 
</resources>
cs
이때 language와 language_value 2가지를 넣었는데, language는 실질적으로 사용자에게 보여주는 List이며, language_value는 SharedPreference에 저장될 값이다. SharedPreference는 나중에 정리를 할 것이니 모르겠다면 구글에 검색해보자. 갓글



ListPreference에 넣을 List를 만들었다면 다시 아까 작성했던 ListPreference를 보자
1
2
3
4
5
6
7
8
9
<androidx.preference.ListPreference
            android:defaultValue="ko"
            android:entries="@array/language"
            android:entryValues="@array/language_value"
            android:key="key_language"
            android:negativeButtonText="@null"
            android:positiveButtonText="@null"
            android:summary="List summary"
            android:title="List Title" />
cs
위 코드에서 android:entries="@array/language"를 통해 실질적으로 보여주며,
android:entryValues="@array/language_value"에서 순차적으로 해당 값들에 대한
key값을 부여해주었다.

3. Fragment로 띄워주기

위에 진행과정들을 다 하고나면 사진과 같이 settings_preference.xml에서 preview를 볼 수 있을 것이다. 이제 이 완성된 Preference를 fragment를 통해 띄워줘야한다. 이때 fragment는 Activity 내에 생성되는, UI 구성을 여러 개의 모듈 단위로 작성할 수 있도록 해주는 기능이다. 또한 구글에서는 다음과 같이 fragment를 정의하고 있다.


fragment는 자체 수명 주기를 가지고, 자체 입력 이벤트를 받으며, 액티비티 실행 중에 추가 및 제거가 가능한 액티비티의 모듈식 섹션이라고 생각하면 된다. (다른 액티비티에 재사용할 수 있는 "하위 액티비티"와 같은 개념)

참고 : 개발자를 위한 레시피

3.1 SettingFragment.java

settings_preference.xml을 onCreate해주고 각 기능들을 정의해줄 java파일을 하나 만든다. 이때 extends해주는 것은 PreferenceFragmentCompat이다. 다른 것들은 deprecated 됐으니까 PreferenceFragmentCompat을 써줘야한다.
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
public class SettingFragment extends PreferenceFragmentCompat{
 
    private static final String SETTING_CHKBOX = "key_chk_box";
    private static final String SETTING_EDITTEXT = "key_edit_text";
    private static final String SETTING_LANGUAGE = "key_language";
    private static final String SETTING_DEPTEST = "key_dependent";
    private static final String SETTING_DEPCHILD = "key_dependent_child";
    SharedPreferences prefs;
 
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.settings_preference);
        prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        prefs.registerOnSharedPreferenceChangeListener(prefListener);
    }
 
    SharedPreferences.OnSharedPreferenceChangeListener prefListener =
    new SharedPreferences.OnSharedPreferenceChangeListener() {
        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // key값에 해당하는 명령 넣기
            if (key.equals(SETTING_CHKBOX)) {
                Log.d("TAG", key + "SELECTED");
            } else if (key.equals(SETTING_DEPTEST)) {
                Log.d("TAG", key + "SELECTED");
            } else if (key.equals(SETTING_DEPCHILD)) {
                Log.d("TAG", key + "SELECTED");
            } else if (key.equals(SETTING_EDITTEXT)) {
                Log.d("TAG", key + "SELECTED");
            } else if (key.equals(SETTING_LANGUAGE)) {
                Log.d("TAG", key + "SELECTED");
            }
 
        }
    };
 
}
cs

4. 원하는 Layout에 fragment 넣어주기

settings_preference를 SettingFragment를 통해 fragment에 담아주었다. 이제 이 fragment를 보여줄 View를 Layout에서 설정해서 보여주면된다.
1
2
3
4
5
<fragment
    android:id="@+id/settings_fragment"
    android:name="com.uni.settingtest.SettingFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
cs
위와 같은 형식으로 말이다. 그렇게 하고 컴파일을 해주면 아래 사진과 같은 결과 화면을 볼 수 있다.