【Android】편리한 PreferenceFragmentCompat로 설정 화면을 만든다

Jetpack Preference



공식 페이지

Jetpack의 Preference를 사용하는 것으로, 설정 화면을 간단하게 작성할 수 있다.

환경 구축


app/build.gradle에 다음 추가
dependencies {
    implementation 'androidx.preference:preference:1.0.0'
}

구현



간단한 샘플



  • 우선은 설정의 항목을 정의한, res/xml/preferences.xml 를 이하의 내용으로 작성한다
    <androidx.preference.PreferenceScreen
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <SwitchPreferenceCompat
            app:key="notifications"
            app:title="Enable message notifications"/>
    
        <Preference
            app:key="feedback"
            app:title="Send feedback"
            app:summary="Report technical issues or suggest new features"/>
    
    </androidx.preference.PreferenceScreen>
    

    ※ xml의 루트가 PreferenceScreen 되어 있는 것에 주의

  • 그런 다음 PreferenceFragmentCompat을 상속받은 Fragment 만들기

    SettingsFragment.kt
    class SettingsFragment : PreferenceFragmentCompat() {
    
        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
            setPreferencesFromResource(R.xml.preferences, rootKey)
        }
    }
    
    setPreferencesFromResource에 정의된 res/xml/preferences.xml 설정

  • 기본 Activity에서 만든 SettingsFragment 보기

    SettingsActivity.kt
    class SettingsActivity : RxAppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_settings)
    
            supportFragmentManager
                .beginTransaction()
                .replace(R.id.settingsContainer, SettingsFragment())
                .commit()
        }
    }
    

    레이아웃 파일에 Fragment가 표시되는FrameLayout 정의

    res/layout/activity_settings.xml
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:app="http://schemas.android.com/apk/res-auto"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
    
        <androidx.appcompat.widget.Toolbar
                android:id="@+id/settingsToolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="?attr/actionBarSize"
                android:background="?attr/colorPrimaryDark"
                app:titleTextColor="@android:color/white"/>
    
        <FrameLayout
                android:id="@+id/settingsContainer"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/settingsToolbar"/>
    
    </RelativeLayout>
    


  • 상기까지 실장하면, 한번 실행해 본다.

    res/xml/preferences.xml에 정의 된 내용이 표시되면 OK

    SharedPreference 파일 이름



    생성되는 SharedPreference 파일 이름은
    "${BuildConfig.APPLICATION_ID}_preferences"
    

    된다.

    Preference의 종류



    목록은 여기
  • Preference
  • 기본 구성 요소에 해당하는 키 - 값 쌍이있는

  • EditTextPreference
  • String 값을 보관 유지하는 Preference, 입력란이 텍스트 필드로 표시된다

  • ListPreference
  • String 값을 보관 유지하는 Preference, 입력란이 라디오 버튼의 리스트로 표시된다

  • MultiSelectListPreference
  • 일련의 문자열을 유지하는 설정, 입력란이 레이블이 지정된 확인란 목록에 표시됨

  • SeekBarPreference
  • 정수 값을 유지하는 설정, 입력란이 검색 바에 표시됨

  • SwitchPreferenceCompat
  • 부울 값을 유지하는 설정, 입력 필드가 스위치로 표시됨

  • CheckBoxPreference
  • 부울 값을 유지하는 설정, 입력란이 확인란에 표시됨


  • SharedPreferences에 저장되었을 때 뭔가를 원한다면



    SharedPreferences.OnSharedPreferenceChangeListener 사용
    SharedPreferences#registerOnSharedPreferenceChangeListener에서 listener를 등록.
    ※ 상기를 익명 함수로 해 버리면 잘 움직이지 않으므로 주의 여기 참조

    PreferenceFragmentCompat 종료 시점에 등록 취소SharedPreferences#unregisterOnSharedPreferenceChangeListener
        var sharedPreferences: SharedPreferences? = null
    
        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
            setPreferencesFromResource(R.xml.preferences, rootKey)
    
            context?.also {
                // SharedPreferencesを取得しOnSharedPreferenceChangeListenerを設定
                sharedPreferences = it.getSharedPreferences("xxxxxxxxx", Context.MODE_PRIVATE).apply {
                    registerOnSharedPreferenceChangeListener(changeListener)
                }
            }
        }
    
        override fun onDestroy() {
            super.onDestroy()
            context?.also {
                // OnSharedPreferenceChangeListenerの登録解除
         sharedPreferences?.unregisterOnSharedPreferenceChangeListener(changeListener)
            }
        }
    
        private val changeListener = SharedPreferences.OnSharedPreferenceChangeListener { pref, key ->
            // do something
        }
    

    관련 링크



  • [Android] PreferenceFragmentCompat로 설정 화면 만들기
  • 좋은 웹페이지 즐겨찾기