androidx.preference는 이전에 알아본 Preferences의 구조를 차용해 앱에서 필요한 설정값을 손쉽게 관리할 수 있도록 해주는 API를 제공합니다. 이 API를 사용하면 XML을 구성하는 것만으로도 사용자로부터 설정값을 저장하고 저장된 값을 읽을 수 있습니다.
우선 androidx.preference를 사용하기 위해서는 의존성 라이브러리를 추가해야 합니다. 우선 Gradle Scripts -> build.gradle (Module:app) 파일을 열고 오른쪽 상단에 Open(Ctrl+Alt+Shift+S)를 클릭합니다.
이어지는 화면의 왼쪽 메뉴에서 Dependencies를 클릭하고 + 버튼을 눌러 Library Dependency를 선택합니다. 그리고 step1에서 preperence를 입력한 뒤 Search를 눌러 잠시 기다리면 다음과 같이 목록이 나오게 되고
이 중에서 androidx.preference를 선택하고 OK 버튼을 눌러준뒤 그다음 화면에서 또 한 번 OK 버튼을 눌러줍니다. 이렇게 하면 상기 build.gradle (Module:app) 파일의 내용은 다음과 같이 변경되어 있음을 확인할 수 있습니다.
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.1'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'androidx.preference:preference:1.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
이제 다음과 같은 방법으로 설정화면에 필요한 preferences.xml을 생성합니다. res 폴더에서 마우스 오른쪽 버튼을 눌러 New -> Adnroid Resource File을 선택하세요.
파일 설정화면에서 File name에 preferences를 입력하고 Resouce type에는 XML을 선택합니다. 나머지 사항이 아래 화면과 동일하게 맞춰져 있는지 확인 후 OK 버튼을 눌러주면 됩니다.
그러면 Activity를 디자인할때와 비슷한 디자인 화면을 볼 수 있는데 여기서 앱에 필요한 여러 가지 설정 사항들을 추가할 수 있습니다.
우선 Group 카테고리에 있는 PreferenceCategory를 추가하고 title을 원하는 내용으로 수정합니다.
Preferences 카테고리에서도 필요한 설정필드를 추가하고 DefaultValue, key, title 등을 수정하여 적절하게 설정필드를 맞춰줍니다.
ListPreference를 사용하려면 필요한 목록이 미리 만들어져 있어야 합니다. res -> values에서 마우스 오른쪽 버튼을 통해 New -> Values resource File을 선택합니다.
File name에 list_array를 입력합니다.
그리고 생성되는 list_array.xml 파일을 다음과 같이 수정줍니다. 필요하다면 resources안에 다수의 string-array요소를 포함시킬 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="color_list">
<item>red</item>
<item>green</item>
<item>blue</item>
</string-array>
</resources>
다시 preference화면으로 돌아와 ListPreference필드를 끌어오고 다음과 같이 위에서 추가한 list_arrary를 선택합니다.
이런 방법으로 화면을 아래와 같이 완성합니다. 참고로 예제는 무작위로 아무렇게나 배치한 화면이지만 실제 필요하다면 그에 맞게끔 구조를 맞춰야 하고 특히 key값은 신중하게 정하는 것이 좋습니다.
XML내용은 다음과 같습니다.
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="앱설정">
</PreferenceCategory>
<CheckBoxPreference
android:defaultValue="false"
android:key="auto_login"
android:title="자동로그인" />
<EditTextPreference
android:defaultValue="Default value"
android:key="user_id"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="아이디입력" />
<ListPreference
android:defaultValue="1"
android:entries="@array/color_list"
android:entryValues="@array/color_list"
android:key="app_color"
android:title="색상" />
<PreferenceCategory android:title="사용자설정">
</PreferenceCategory>
<SwitchPreference
android:defaultValue="true"
android:key="app_mode"
android:title="모드" />
</PreferenceScreen>
이제 이렇게 완성한 설정화면을 View로 생성하기 위해 Fragment클래스를 생성해야 합니다. app -> java -> [패키지]에서 New -> Kotlin File/Class를 선택합니다.
Class를 선택하고 파일명을 적절히 정한 다음 OK 버튼을 누릅니다.
생성된 클래스를 PreferenceFragmentCompat() 에서 상속받게 수정한 다음
class SettingsFragment: PreferenceFragmentCompat() {
}
Ctrl + O 키를 누른 후 onCreatePreferences.. 를 선택합니다.
그러면 선택한 메서드의 코드가 생성되는데 TODO는 삭제하고 onCreatePreferences 블록 안에서 addPreferencesFromResource메서드를 호출해 매개변수로 위에서 생성한 preferences파일을 넘겨주도록 합니다.
class SettingsFragment: PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.preferences)
}
}
이제 activity_main으로 돌아와 Common안에 있는 <fragment>를 화면으로 끌어다 놓습니다. 그리고 이어지는 화면에서 생성한 SettingsFragment를 목록에서 선택한 뒤 OK 버튼을 눌러줍니다.
추가된 Fragment를 다음과 같이 화면을 가득 채우도록 레이아웃을 조정하고
앱을 실행해 보면 다음과 같이 설정화면을 볼 수 있게 됩니다.
위에서 설정한 값은 SharedPreferences에 저장되고 PreferenceManager의 getDefaultSharedPreferences() 메서드로 저장된 값을 다음과 같이 가져올 수 있습니다.
val setting_value = PreferenceManager.getDefaultSharedPreferences(this)
val auto_login = setting_value.getBoolean("auto_login", false)
val user_id = setting_value.getString("user_id", "id")
val app_color = setting_value.getString("app_color", "red")
val app_mode = setting_value.getBoolean("app_mode", true)
Log.d("test", "입력된 아이디 : ${user_id}")
실제 설정값을 변경해 저장된 값을 직접 확인해 보세요.
'Mobile > Kotlin' 카테고리의 다른 글
[kotlin] SQLite - 연결및 사용하기 (0) | 2020.12.30 |
---|---|
[kotlin] SQLite - SQLite Open Helper 구현하기 (0) | 2020.12.29 |
[kotlin] Preferences (0) | 2020.12.28 |
[kotlin] 저장소및 파일처리 (0) | 2020.12.24 |
[kotlin] 권한 처리하기 (0) | 2020.12.23 |