Für PreferenceFragmentCompat muss das PreferenceTheme festgelegt werden

114

Mit dem neuen PreferenceFragmentCompat aus der v7 Preference Support Library: http://developer.android.com/tools/support-library/features.html#v7-preference wird dieser Fehler angezeigt

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

Welches Thema sollte eingestellt werden?

Update: Ich habe es versucht

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

wie von @Bogato vorgeschlagen, aber es sieht nicht richtig aus und sieht selbst auf Lollipop sehr holo aus.

Unterstützungsbibliothek:

Geben Sie hier die Bildbeschreibung ein

Native Präferenzen:

Geben Sie hier die Bildbeschreibung ein

Komplikationen
quelle
2
Es ist ein Fehler über die Dokumentation für diese hier: code.google.com/p/android/issues/...
Intrications
1
Persönlich denke ich nicht, dass diese Lösungen die Problemumgehung wert sind. Versuchen Sie es mit github.com/kolavar/android-support-v4-preferencefragment
MidasLefko
1
Können Sie bitte stackoverflow.com/a/44236460/238753 als akzeptierte Antwort markieren ?
Sam

Antworten:

159

Das Beispielprojekt finden Sie hier

Der Bugfix ist als Gradle-Abhängigkeit verfügbar

Herunterladen

Jetzt kann man die Bibliothek ziemlich einfach benutzen. Hier ist der schnellste Weg, dies zu tun. Weitere Informationen finden Sie in der README-Datei.

1. Aktualisieren Sie die Gradle-Datei Ihres Moduls:

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

2. Verwenden Sie die entsprechende Klasse als Basis für Ihr Fragment

Sie können entweder PreferenceFragmentCompatoder verwenden PreferenceFragmentCompatDividers.

( Achten Sie beim Import auf den entsprechenden Paketnamen PreferenceFragmentCompat! )

3. Verwenden Sie das entsprechende Thema

@style/PreferenceFixThemeStellen Sie das Thema Ihrer enthaltenen Aktivität auf eine Variante von NoActionBar, Light usw. ein.

Weitere Informationen und Verwendungstipps finden Sie auf der Projektseite .


PS In diesem Abschnitt finden Sie die detaillierte Lösung, die zur Erstellung der Bibliothek geführt hat. Ich habe mich jedoch entschlossen, sie zu entfernen, da sie möglicherweise verwirrend ist. Wenn Sie neugierig auf die Schritte sind, finden Sie sie immer noch im Revisionsverlauf dieser Antwort.

Gergely Kőrössy
quelle
6
Die Standardtextgröße ist zu groß. Ich habe versucht, sie mit diesen Stilen zu ändern, auf die Sie hingewiesen haben, ohne Erfolg. Haben Sie es vielleicht geschafft, die Textgröße anzupassen?
Tinashe
4
Ich versuche, das Materialdesign dort einzufügen, bin aber nicht wirklich erfolgreich ... Während des Vorgangs habe ich festgestellt, dass im v7-Einstellungspaket der Materialstil, das Layout und andere Dateien vollständig fehlen. In der Zwischenzeit enthält die Version 14 einige davon, aber das Problem mit der Version 14 ist, dass sie das native Fragment erweitert, nicht das unterstützende. Ich denke, Google hat hier gerade einen wirklich großen Fehler gemacht, hoffentlich beheben sie ihn so schnell wie möglich ...
Gergely Kőrössy
1
Ich könnte versuchen, das Materialdesign auch für Geräte vor 21 Jahren zu implementieren. Sie sehen jetzt genauso aus wie das Original.
Gergely Kőrössy
2
Sie sollten auch erwähnen, dass PreferenceFragmentCompat abstürzt, wenn es mit einem geöffneten Dialogfeld gedreht wird. code.google.com/p/android/issues/detail?id=186160
Headsvk
21
Das ist lächerlich. Ich würde weniger Zeit brauchen, um ein Präferenzfragment von Grund auf neu zu erstellen, als einen Weg durch alle Fehler, Problemumgehungen und Tests zu finden, die erforderlich sind, damit dies bei allen Versionen zu 100% funktioniert.
Edward van Raak
46

Sie müssen PreferenceTheme im Thema Ihrer Präferenzaktivität angeben.

Zum Beispiel :

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

PreferenceThemeOverlay ist das Standarddesign, das mit der Support-Bibliothek für Preference-v7 geliefert wird.

Bogato
quelle
14
Das funktioniert, aber es sieht falsch aus. Die Schriftarten der Voreinstellungselemente sind zu groß (getestet auf Android 4.1 und 5.1).
@ mus65 Das ist das Problem. Ich hatte gedacht, ich sollte dieses Thema verwenden, aber es sieht schlecht aus. Ich habe der ursprünglichen Frage weitere Details hinzugefügt.
Komplikationen
3
Ich habe dies als die richtige Antwort ausgewählt, weil es die erste war, die das richtige Thema festlegte. Allerdings ist die Support - Bibliothek muß so befestigt werden , dass die Präferenzen Materialdesign verwendet nach code.google.com/p/android/issues/detail?id=183376
Intrications
Wie lasse ich das Thema Material-Design aussehen? Derzeit zeigt es den nativen Look für mich ...
Android-Entwickler
1
Lesen Sie meine Antwort unten.
Gergely Kőrössy
35

Google hat dieses Problem anscheinend behoben. Ich habe dies mit der Voreinstellung v14-support Version 25.3.1 getestet

1) Fügen Sie implementation 'com.android.support:preference-v14:25.3.1'Ihrem Gradle hinzu.

2) PreferenceThemeOverlay.v14.MaterialZum Stil hinzufügen statt PreferenceThemeOverlay.

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

3) Fügen Sie schließlich den Stil zum Manifest hinzu

android:theme="@style/AppTheme.SettingsTheme"
Srikar Reddy
quelle
Das einzige Problem bei dieser Antwort ist, dass das Präferenzfragment das Materialthema auf Systemen verwendet, auf denen KitKat und darunter ausgeführt wird. Das Einstellen preferenceThemevon PreferenceThemeOverlay.v14in styles.xmlund PreferenceThemeOverlay.v14.Materialin styles-v21.xmlbe behebt das Problem.
Jack Meister
@ JackMeister Sie sollten die Version 14 nur verwenden, wenn Sie auf API-Level 14 oder höher abzielen. Die Inkompatibilität von Designs mit älteren Versionen ist möglicherweise nicht das einzige Problem, wenn Sie v14 mit älteren API-Levels verwenden.
Jelmer Brands
@JelmerBrands Sicher: Sie sollten keine v14-Unterstützungsbibliothek auf Systemen verwenden, auf denen API-Level unter 14 ausgeführt werden. Mein Kommentar geht von einem minSdkVersionzwischen 14 und 20 aus.
Jack Meister
Getestet mit 23.4.0, was genauso gut funktioniert. Die Verwendung der v14-Präferenz, nicht der v7-Präferenz, ist der Schlüssel.
user149408
14

Um den PreferenceFragmentCompat zu verwenden , müssen Sie preferenceThemein Ihrem Thema Folgendes festlegen :

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

Auf diese Weise können Sie das anpassen preferenceTheme, um die für jeden Voreinstellungstyp verwendeten Layouts zu formatieren, ohne andere Teile Ihrer Aktivität zu beeinflussen.

Gabriele Mariotti
quelle
Stellen
Youness
14

Ich habe diese Zeile gerade zum Thema hinzugefügt und sie funktioniert perfekt unter API 19 und höher.

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
Elan
quelle
3
Dies ist die einfachste funktionierende Lösung, für die keine zusätzliche Abhängigkeit erforderlich ist. Sollte meiner Meinung nach die akzeptierte Antwort sein, jetzt, da die meisten Apps mindestens API 14+ sind
Louis CAD
Android Studio kann dies nicht finden
Denny
3
füge com.android.support:preference-v14 hinzu: zu build.gradle
Sofi Software LLC
3

Lösung, die in API 25 für mich funktioniert hat. Ich hatte dieses Standardthema:

<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>

Und fügte diese Zeile hinzu

<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 wurde bereits definiert, ich musste es nicht einschließen. Es funktionierte auf meinen eigenen Android 4.x- und 5.x-Geräten

voghDev
quelle
2

Fügen Sie diesen Code zu Ihrer styles.xml hinzu und ändern Sie ihn entsprechend. Es sollte gut funktionieren.

<!-- 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>

Prashant Paliwal
quelle
1

Ich habe das Element "priorityTheme" in meinen Stil aufgenommen und das schien das Problem zu beheben:

   <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>
Sergio Geralnik
quelle
1

Die hilfreichste Seite für mich: Mittel

Der Autor zeigt, dass wir zwei Pakete hinzufügen müssen: com.android.support:preference-v7undcom.android.support:preference-v14 , weil das erste ohne Stile verteilt wird.

Lass mich wissen ob es funktioniert

macieg_b
quelle
0

Das akzeptierte "Takisoft Fix" wirkt ziemlich klobig und nachdem ich damit herumgespielt habe, bin ich immer noch nicht zufrieden mit dem resultierenden Look.

Wenn Sie eine API 9+ PreferenceFragmentSupport-Bibliothek benötigen , empfehle ich die Verwendung der Material Preference Support Library . Es funktioniert perfekt (zumindest für mich).

shredEngineer
quelle
0

Das Problem tritt auf, weil das AAPT (Android Asset Packaging Tool) einige Ressourcen nicht finden kann. Beheben Sie dieses Problem wie folgt:

1.Kopieren Sie Ressourcen, die für einen neuen antwortenden Ressourcenordner mit dem Namen res_fw_v7_preference oder etwas anderem erforderlich sind.

2.Verwenden Sie gradle, um Ihre Anwendung zu erstellen und einige zusätzliche AAPT-Optionen in build.gradle (Modulen) wie folgt hinzuzufügen:

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:!*~'
    }
    ...
}

Hoffe das ist hilfreich :)

Jason
quelle
0

Vielen Dank an @sergio für die Antwort. Die Verwendung von <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>statt <item name="preferenceTheme">@style/Preference</item>funktioniert für mich großartig.

<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>
Queendevelopers
quelle
-8

Lassen Sie es einfach los und verwenden Sie API 11+.

API 7 ist jetzt fast sieben Jahre alt.

trans
quelle