본문 바로가기

나의 플랫폼/안드로이드

[Android] Preferencefragment deprecated

설정 화면을 개발할 때, PreferenceFragment를 많이 사용 했습니다.


PreferenceActivity에 PreferenceFragment를 설정하는 형태 였죠.

class SettingsActivity : PreferenceActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

f
ragmentManager.beginTransaction()
.replace(android.R.id.
content, SettingFragment())
.commit()
}

class SettingFragment : PreferenceFragment() {

override fun onCreatePreferences(savedInstanceState: Bundle?) {
addPreferencesFromResource(R.xml.
preference_setting)

...
}
}
}

하지만, 위와 같이 만들게 되면 여러 군데에서 deprecated 되는 것을 확인 할 수 있습니다.


PreferenceAcitivity, fragmentManager, PreferenceFragment 이 세 클래스를 다른 것으로 교체를 해야 하는데요.


교체하는 방법은 아래와 같습니다.

class SettingsActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

supportFragmentManager.beginTransaction()
.replace(android.R.id.
content, SettingFragment())
.commit()
}

class SettingFragment : PreferenceFragmentCompat() {

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.
preference_setting)

...
}
}
}

1. build.gradle (app단) 에 support preference-v7 추가

dependencies {
...
implementation "com.android.support:preference-v7:27.1.1"

...

}


2. PreferenceActivity를 AppCompatActivity로 변경

3. fragmentManager를  supportFragmentManager로 변경

4. PreferenceFragment를 PreferenceFragmentCompat 으로 변경


5. xml layout에 있는 Preference를 support library에서 지원하는 클래스로 변경

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v7.preference.ListPreference
android:title=""
android:summary=""
android:key="" />
<android.support.v7.preference.EditTextPreference
android:title=""
android:summary=""
android:key="" />
</android.support.v7.preference.PreferenceScreen>


위와 같이 설정하고 빌드를 하면 아래와 같은 에러 문구를 볼 수 있다.


Must specify preferenceTheme in the theme


해석 하면 아시겠지만, 테마를 설정하라는 에러 입니다. 

그럼 테마에 Preference 스타일을 정의 하겠습니다.


6. styles.xml에서 AppCompatTheme에 아래와 같이 스타일 추가해주세요.

<style name="AppCompatTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
    ...
</style>


그럼 문제 없이 동작할 겁니다.

참고하세요.