PreferenceFragmentCompat을 사용하려면 preferencesTheme를 설정해야합니다.


114

v7 환경 설정 지원 라이브러리의 새로운 PreferenceFragmentCompat : http://developer.android.com/tools/support-library/features.html#v7-preference 를 사용하면이 오류가 발생합니다.

E  java.lang.IllegalStateException: Must specify preferenceTheme in theme
E      at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:202)

어떤 테마를 설정해야합니까?

업데이트 : 나는 사용해 보았다

<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>

@Bogato가 제안한 것처럼 보이지만 Lollipop에서도 옳지 않고 홀로 보입니다.

지원 라이브러리 :

여기에 이미지 설명 입력

기본 설정 :

여기에 이미지 설명 입력


2
여기에 문서에 대한 버그가 있습니다. code.google.com/p/android/issues/…
Intrications

1
개인적으로 저는 이러한 솔루션이 해결 방법의 가치가 있다고 생각하지 않습니다. 시도 github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
stackoverflow.com/a/44236460/238753 을 허용 된 답변으로 표시해 주 시겠습니까?
Sam

답변:


159

샘플 프로젝트는 여기에서 찾을 수 있습니다.

버그 수정은 gradle 종속성으로 사용할 수 있습니다.

다운로드

이제 라이브러리를 매우 쉽게 사용할 수 있습니다. 여기에 가장 빠른 방법이 있지만 자세한 내용은 README를 확인해야합니다.

1. 모듈의 gradle 파일을 업데이트합니다.

compile 'com.takisoft.fix:preference-v7:27.0.0.0'

2. 적절한 클래스를 조각의 기반으로 사용

당신은 사용할 수 있습니다 PreferenceFragmentCompat또는PreferenceFragmentCompatDividers .

( 가져올 때 적절한 패키지 이름을주의하십시오 PreferenceFragmentCompat! )

3. 적절한 테마 사용

포함하는 활동의 테마를 @style/PreferenceFixThemeNoActionBar, Light 등과 같은 변형으로 설정합니다 .

자세한 정보 및 사용 팁은 프로젝트 페이지 로 이동 하십시오 .


추신이 섹션에서는 라이브러리 생성으로 이어진 자세한 솔루션을 찾을 수 있지만 혼란 스러울 수 있으므로 제거하기로 결정했습니다. 단계에 대해 궁금한 경우이 답변 의 업데이트 기록 에서 찾을 수 있습니다 .


6
기본 텍스트 크기가 너무 큽니다. 성공하지 못한 상태에서 지적한 이러한 스타일을 사용하여 수정 해 보았습니다. 텍스트 크기를 조정 했습니까?
티나

4
저는 머티리얼 디자인을 거기에 넣으려고했지만 실제로는 성공하지 못했습니다. 그 과정에서 제가 발견 한 것은 v7 기본 설정 팩에 머티리얼 테마 스타일, 레이아웃 및 기타 파일이 완전히 없다는 것입니다. 한편 v14에는 그중 일부가 포함되어 있지만 v14의 문제는 지원되는 조각이 아니라 기본 조각을 확장한다는 것입니다. 내가 잘하면 그들이 ... 빨리 그것을 수정, 구글은 여기 정말 큰 실수를했다고 생각
게르 겔리 Kőrössy에게

1
21 세 이전 기기에도 머티리얼 디자인을 적용하려고 할 수도 있지만, 지금은 원본과 동일하게 보입니다.
Gergely Kőrössy

2
열린 대화 상자로 회전하면 PreferenceFragmentCompat이 충돌한다는 점도 언급해야합니다. code.google.com/p/android/issues/detail?id=186160
headsvk 2013 년

21
이건 말도 안돼. 모든 버전에서이 작업을 100 % 수행하는 데 필요한 모든 버그, 해결 방법 및 테스트를 통해 방법을 찾는 것보다 처음부터 환경 설정 조각을 만드는 데 시간이 덜 걸립니다.
Edward van Raak

46

기본 설정 활동의 테마에서 preferencesTheme를 지정해야합니다.

예 :

<style name="SettingsTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

PreferenceThemeOverlay는 preferences-v7 지원 라이브러리와 함께 제공되는 기본 테마입니다.


14
작동하지만 잘못된 것 같습니다. 기본 설정 요소의 글꼴이 너무 큽니다 (Android 4.1 및 5.1에서 테스트 됨).

@ mus65 그게 문제입니다. 나는 그 테마를 사용해야한다고 생각했지만 좋지 않은 것 같습니다. 원래 질문에 더 많은 세부 정보를 추가했습니다.
Intrications

3
정답을 정한 첫 번째 주제이므로 정답으로 선택했습니다. 그러나 기본 설정이 code.google.com/p/android/issues/detail?id=183376
Intrications

테마를 머티리얼 디자인처럼 보이게하려면 어떻게합니까? 현재는 ... 나를 위해 기본 모양을 보여줍니다
안드로이드 개발자

1
아래 내 대답을 읽으십시오.
Gergely Kőrössy 2015 년

35

Google이이 문제를 해결 한 것 같습니다. 환경 설정 v14 지원 버전 25.3.1로 이것을 테스트했습니다.

1) 추가 implementation 'com.android.support:preference-v14:25.3.1' Gradle에 하십시오.

2) PreferenceThemeOverlay.v14.Material대신 스타일에 추가하십시오 PreferenceThemeOverlay.

<style name="AppTheme.SettingsTheme" parent="AppTheme.NoActionBar">
    <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>

3) 마지막으로 Manifest에 스타일을 추가하십시오.

android:theme="@style/AppTheme.SettingsTheme"

이 답변의 유일한 문제는 환경 설정 조각이 KitKat 이하를 실행하는 시스템에서 재료 테마를 사용한다는 것입니다. 설정 preferenceThemePreferenceThemeOverlay.v14styles.xml와에 PreferenceThemeOverlay.v14.Material있는 styles-v21.xml문제 수정.
Jack Meister

@JackMeister는 API 레벨 14 이상을 대상으로하는 경우에만 v14 버전을 사용해야합니다. 이전 버전과의 테마 비 호환성은 이전 API 수준에서 v14를 사용할 때 유일한 문제가 아닐 수 있습니다.
Jelmer Brands

@JelmerBrands 물론입니다. API 레벨이 14 미만인 시스템에서 v14 지원 라이브러리를 사용해서는 안됩니다. 제 의견은 minSdkVersion14에서 20 사이 라고 가정합니다 .
Jack Meister

23.4.0으로 테스트되었으며 잘 작동합니다. v7-preference가 아닌 v14-preference를 사용하는 것이 핵심입니다.
user149408

14

PreferenceFragmentCompat 를 사용하려면preferenceTheme 테마에서 설정 해야합니다.

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

이러한 방식으로 preferenceTheme활동의 다른 부분에 영향을주지 않고 각 기본 설정 유형에 사용되는 레이아웃의 스타일을 지정하도록 을 사용자 지정할 수 있습니다 .


만들기 확실히 당신은 당신의 활동에 대한 테마로 설정되어 어울리는 스타일에 preferenceTheme를 추가 stackoverflow.com/a/40736138/1572286
Youness

14

이 줄을 테마에 추가했으며 API 19 이상에서 완벽하게 작동합니다.

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>

3
이것은 추가 종속성이 필요하지 않은 가장 간단하고 작동하는 솔루션입니다. 대부분의 앱이 최소 API 14 이상이므로 IMHO에 대한 대답이 허용되어야합니다.
Louis CAD

Android 스튜디오에서 이것을 찾을 수 없습니다
Denny

3
com.android.support:preference-v14 : to build.gradle
Sofi Software LLC

3

API 25에서 나를 위해 일한 솔루션입니다.이 기본 테마가 있습니다.

<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

그리고이 줄을 추가했습니다

<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

PreferenceThemeOverlay가 이미 정의되어 있으므로 포함 할 필요가 없습니다. 내 Android 4.x 및 5.x 장치에서 작동했습니다.


2

이 코드를 styles.xml에 추가하고 그에 따라 수정하십시오. 잘 작동합니다.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

<style name="PreferenceThemeOverlay">
    <item name="preferenceScreenStyle">@style/Preference.PreferenceScreen</item>
    <item name="preferenceFragmentStyle">@style/PreferenceFragment</item>
    <item name="preferenceCategoryStyle">@style/Preference.Category</item>
    <item name="preferenceStyle">@style/Preference</item>
    <item name="preferenceInformationStyle">@style/Preference.Information</item>
    <item name="checkBoxPreferenceStyle">@style/Preference.CheckBoxPreference</item>
    <item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat</item>
    <item name="dialogPreferenceStyle">@style/Preference.DialogPreference</item>
    <item name="editTextPreferenceStyle">@style/Preference.DialogPreference.EditTextPreference</item>
    <item name="preferenceFragmentListStyle">@style/PreferenceFragmentList</item>
</style>


1

내 스타일에 "preferenceTheme"항목을 추가했는데 문제가 해결 된 것 같습니다.

   <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:actionBarStyle">@style/MyActionBarTheme</item>
     <item name="colorPrimary">@color/ColorPrimary</item>
     <item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
     <item name="preferenceTheme">@style/Preference</item>
 </style>

1

나에게 가장 도움이되는 사이트 : Medium

우리는 두 개의 패키지를 추가 할 필요가 저자 쇼 : com.android.support:preference-v7com.android.support:preference-v14 첫 번째가 스타일없이 배포되고 있기 때문에.

작동하는지 알려주세요


0

받아 들여진 "Takisoft Fix"는 다소 어색해 보이며 그것을 가지고 놀아 본 후에도 여전히 그 결과물에 만족하지 않습니다.

API 9+ PreferenceFragment지원 라이브러리 가 필요한 경우 Material Preference Support Library를 사용하는 것이 좋습니다 . 완벽하게 작동합니다 (적어도 저에게는).


0

AAPT (Android Asset Packaging Tool)가 일부 리소스를 찾을 수 없기 때문에 문제가 발생합니다. 이 문제를 다음과 같이 수정하십시오.

1. res_fw_v7_preference 또는 다른 이름과 같은 새 응답 리소스 폴더에 필요한 리소스를 복사합니다.

2. Gradle을 사용하여 애플리케이션을 빌드하고 다음과 같이 build.gradle (모듈)에 AAPT 옵션을 추가합니다.

android {
    ...
    aaptOptions {
        additionalParameters '-S',
            'src/main/res_fw_v17_leanback',  // resources in frameworks/support/v17/leanback
            '-S',
            'src/main/res_fw_v7_preference',  // resources in frameworks/support/v7/preference
            '-S',
            'src/main/res_fw_v14_preference',  // resources in frameworks/support/v14/preference
            '-S',
            'src/main/res_fw_v17_preference-leanback',  // resources in frameworks/support/v17/preference-leanback
            '-S',
            'src/main/res_fw_v7_appcompat',  // resources in frameworks/support/v7/appcompat
            '-S',
            'src/main/res_fw_v7_recyclerview',  // resources in frameworks/support/v7/recyclerview
            '-S',
            'src/main/res',  // resources in your application
            '--auto-add-overlay',
            '--extra-packages',
            'android.support.v17.leanback:android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview'
    noCompress 'foo', 'bar'
    ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~'
    }
    ...
}

도움이 되었기를 바랍니다.)


0

덕분에 사용 대답을 @sergio <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>대신 <item name="preferenceTheme">@style/Preference</item>나를 위해 좋은 작동합니다.

<style name="IntentTheme" parent="Theme.AppCompat">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:actionModeBackground">@color/fulltransparent</item>
        <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>

-8

그냥 놓아두고 API 11 이상을 사용하십시오.

API 7은 이제 거의 7 년이되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.