설정 화면을 개발할 때, PreferenceFragment를 많이 사용 했습니다.
PreferenceActivity에 PreferenceFragment를 설정하는 형태 였죠.
class SettingsActivity : PreferenceActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fragmentManager.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>
그럼 문제 없이 동작할 겁니다.
참고하세요.
'나의 플랫폼 > 안드로이드' 카테고리의 다른 글
[Android] Firebase 구글 로그인 시, ApiException 12500 (0) | 2019.01.30 |
---|---|
[Android Weekly][#344] 효율적인 LiveData와 ViewModel 테스팅 (0) | 2019.01.17 |
[Android Studio] [Kotlin] Wild param 방지 (0) | 2018.12.14 |
[Kotlin] [ktlint] BUILD FAILED (0) | 2018.12.14 |
[Kotlin] For loop vs Foreach (0) | 2018.12.12 |