PreferenceFragmentCompat richiede l'impostazione di preferenzaTheme


114

Con il nuovo PreferenceFragmentCompat dalla libreria di supporto delle preferenze v7: http://developer.android.com/tools/support-library/features.html#v7-preference , ottengo questo errore

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

Quale tema impostare?

Aggiornamento: ho provato a usare

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

come suggerito da @Bogato ma non sembra giusto e sembra molto Holo anche su Lollipop.

Libreria di supporto:

inserisci qui la descrizione dell'immagine

Preferenze native:

inserisci qui la descrizione dell'immagine


2
C'è un bug sulla documentazione per questo qui: code.google.com/p/android/issues/…
Intrications

1
Personalmente non penso che queste soluzioni valgano le soluzioni alternative. Prova github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
Puoi contrassegnare stackoverflow.com/a/44236460/238753 come risposta accettata?
Sam

Risposte:


159

Il progetto di esempio può essere trovato qui

Il bugfix è disponibile come dipendenza graduale

Scarica

Ora si può usare la libreria abbastanza facilmente. Ecco il modo più rapido per farlo, ma dovresti controllare il README per maggiori informazioni.

1. Aggiorna il file gradle del tuo modulo:

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

2. Usa la classe appropriata come base del frammento

Puoi usare PreferenceFragmentCompato PreferenceFragmentCompatDividers.

( Fai attenzione al nome del pacchetto appropriato durante l'importazione PreferenceFragmentCompat! )

3. Usa il tema appropriato

Imposta il tema dell'attività contenitore su una variante di @style/PreferenceFixTheme, come NoActionBar, Light, ecc.

Per maggiori informazioni e suggerimenti per l'utilizzo, vai alla pagina del progetto .


PS In questa sezione potresti trovare la soluzione dettagliata che ha portato alla creazione della libreria, ma ho deciso di rimuoverla perché potrebbe creare confusione. Se sei curioso dei passaggi, puoi ancora trovarli nella cronologia delle revisioni di questa risposta.


6
La dimensione del testo predefinita è troppo grande, ho provato a modificarla usando questi stili che hai indicato senza successo. Sei forse riuscito a regolare la dimensione del testo?
Tinashe

4
Sto cercando di inserire il material design, ma non ho avuto successo ... Quello che ho scoperto durante il processo è che il pacchetto di preferenze v7 manca completamente dello stile, del layout e di altri file a tema materiale. Nel frattempo, la v14 ne contiene alcuni, ma il problema con la v14 è che estende il frammento nativo, non quello di supporto. Penso che Google abbia fatto un errore davvero grave qui, si spera che lo risolvano al più presto ...
Gergely Kőrössy

1
Potrei provare a mettere in atto il design del materiale anche per i dispositivi pre-21, ora hanno lo stesso aspetto dell'originale.
Gergely Kőrössy

2
Dovresti anche menzionare che PreferenceFragmentCompat si arresta in modo anomalo se ruotato con una finestra di dialogo aperta. code.google.com/p/android/issues/detail?id=186160
headsvk

21
Questo è ridicolo. Mi ci vorrebbe meno tempo per creare un frammento di preferenza da zero che trovare un modo per risolvere tutti i bug, le soluzioni alternative e i test necessari per far funzionare al 100% tutte le versioni.
Edward van Raak,

46

Devi specificare preferenzaTheme nel tema della tua attività di preferenza.

Per esempio :

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

PreferenceThemeOverlay è il tema predefinito fornito con la libreria di supporto preferenza-v7.


14
Funziona, ma sembra sbagliato. I caratteri degli elementi delle preferenze sono troppo grandi (testati su Android 4.1 e 5.1).

@ mus65 Questo è il problema. Avevo immaginato che avrei dovuto usare quel tema, ma sembra brutto. Ho aggiunto ulteriori dettagli alla domanda originale.
Intrications

3
Ho selezionato questa come risposta corretta perché era la prima che diceva il tema corretto da impostare. Tuttavia la libreria di supporto deve essere corretta in modo che le preferenze utilizzino il material design secondo code.google.com/p/android/issues/detail?id=183376
Intrications

Come faccio a far sembrare il tema materiale-design? Attualmente mostra l'aspetto nativo per me ...
sviluppatore Android

1
Leggi la mia risposta di seguito.
Gergely Kőrössy

35

Sembra che Google abbia risolto questo problema. L'ho testato con la preferenza v14-support versione 25.3.1

1) Aggiungi implementation 'com.android.support:preference-v14:25.3.1'al tuo Gradle.

2) Aggiungi PreferenceThemeOverlay.v14.Materialallo stile invece di PreferenceThemeOverlay.

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

3) Infine, aggiungi lo stile al file Manifest

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

L'unico problema con questa risposta è che il frammento delle preferenze utilizzerà il tema del materiale sui sistemi che eseguono KitKat e inferiori. L'impostazione preferenceThemedi PreferenceThemeOverlay.v14in styles.xmle in PreferenceThemeOverlay.v14.Materialin styles-v21.xmlrisolve il problema.
Jack Meister

@JackMeister dovresti usare la versione v14 solo se scegli come target API di livello 14 o superiore. L'incompatibilità del tema con le versioni precedenti potrebbe non essere l'unico problema quando si utilizza la v14 con livelli API precedenti.
Jelmer Brands

@JelmerBrands Certo: non dovresti usare una libreria di supporto v14 su sistemi che eseguono livelli API inferiori a 14. Il mio commento presuppone un valore minSdkVersioncompreso tra 14 e 20.
Jack Meister

Testato con 23.4.0, che funziona altrettanto bene. La chiave è utilizzare la preferenza v14, non la preferenza v7.
user149408

14

Per usare PreferenceFragmentCompat devi impostare preferenceThemenel tuo tema:

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

In questo modo puoi personalizzare lo preferenceThemestile dei layout utilizzati per ciascun tipo di preferenza senza influire su altre parti della tua attività.


Assicurati di aggiungere preferenzaTheme allo stile giusto impostato come tema per la tua attività stackoverflow.com/a/40736138/1572286
Youness

14

Ho appena aggiunto questa riga nel tema e funziona perfettamente su API 19 e versioni successive.

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

3
Questa è la soluzione più semplice e funzionante, che non richiede dipendenze aggiuntive. Secondo me dovrebbe essere la risposta accettata, ora che la maggior parte delle app sono API 14+ min
Louis CAD

Studio Android non riesce a trovarlo
Denny

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

3

Soluzione che ha funzionato per me nell'API 25. Avevo questo tema predefinito:

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

E ha aggiunto questa linea ad esso

<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 era già stato definito, non ho dovuto includerlo. Ha funzionato sui miei dispositivi Android 4.xe 5.x.


2

Aggiungi questo codice al tuo styles.xml e modificalo in base. Dovrebbe funzionare bene.

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

Ho aggiunto l'elemento "preferenzaTheme" nel mio stile e questo sembrava risolvere il problema:

   <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

Il sito più utile per me: Medium

L'autore mostra che dobbiamo aggiungere due pacchetti: com.android.support:preference-v7e com.android.support:preference-v14, poiché il primo viene distribuito senza stili.

Fammi sapere se funziona



0

Il problema si verifica perché AAPT (Android Asset Packaging Tool) non riesce a trovare alcune risorse. Risolvi questo problema come segue:

1.Copiare le risorse necessarie in una nuova cartella di risorse di risposta, denominata come res_fw_v7_preference o qualcos'altro.

2.Utilizzare gradle per creare la tua applicazione e aggiungere alcune opzioni AAPT aggiuntive in build.gradle (moduli) in questo modo:

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

Spero che questo sia utile :)


0

Grazie @sergio per la risposta, l'uso <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>invece di <item name="preferenceTheme">@style/Preference</item>funziona benissimo per me.

<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

Lascialo andare e usa l'API 11+.

L'API 7 ha quasi sette anni ormai.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.