PreferenceFragmentCompat requiere que se establezca preferenciaTheme


114

Con el nuevo PreferenceFragmentCompat de la biblioteca de soporte de preferencias v7: http://developer.android.com/tools/support-library/features.html#v7-preference , aparece este error

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

¿Qué tema debería establecerse?

Actualización: he intentado usar

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

como lo sugiere @Bogato, pero no se ve bien y se ve muy Holo incluso en Lollipop.

Biblioteca de soporte:

ingrese la descripción de la imagen aquí

Preferencias nativas:

ingrese la descripción de la imagen aquí


2
Hay un error sobre la documentación para esto aquí: code.google.com/p/android/issues/…
Intrications

1
Personalmente, no creo que estas soluciones valgan la pena. Prueba github.com/kolavar/android-support-v4-preferencefragment
MidasLefko

1
¿Puede marcar stackoverflow.com/a/44236460/238753 como la respuesta aceptada?
Sam

Respuestas:


159

El proyecto de muestra se puede encontrar aquí

La corrección de errores está disponible como una dependencia de Gradle

Descargar

Ahora se puede utilizar la biblioteca con bastante facilidad. Esta es la forma más rápida de hacerlo, pero debe consultar el archivo README para obtener más información.

1. Actualice el archivo gradle de su módulo:

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

2. Usa la clase apropiada como base de tu fragmento

Puede usar PreferenceFragmentCompatoPreferenceFragmentCompatDividers .

Tenga cuidado con el nombre del paquete apropiado al importar PreferenceFragmentCompat! )

3. Usa el tema apropiado

Establezca el tema de la actividad que lo contiene en una variante de @style/PreferenceFixTheme, como NoActionBar, Light, etc.

Para obtener más información y consejos de uso, vaya a la página del proyecto .


PD En esta sección puede encontrar la solución detallada que llevó a la creación de la biblioteca, pero decidí eliminarla porque podría resultar confuso. Si tiene curiosidad acerca de los pasos, aún puede encontrarlos en el historial de revisión de esta respuesta.


6
El tamaño de texto predeterminado es demasiado grande, intenté modificarlo usando estos estilos que señaló sin éxito. ¿Quizás lograste ajustar el tamaño del texto?
Tinashe

4
Estoy tratando de poner el diseño de material allí, pero no tengo mucho éxito ... Lo que descubrí durante el proceso es que al paquete de preferencias v7 le falta por completo el estilo temático del material, el diseño y otros archivos. Mientras tanto, la v14 contiene algunos de ellos, pero el problema con la v14 es que extiende el fragmento nativo, no el de soporte. Creo que Google acaba de cometer un gran error aquí, espero que lo arreglen lo antes posible ...
Gergely Kőrössy

1
También podría intentar poner el diseño de material en su lugar para dispositivos anteriores a 21, ahora se ven iguales que los originales.
Gergely Kőrössy

2
También debe mencionar que PreferenceFragmentCompat se bloquea si se gira con un cuadro de diálogo abierto. code.google.com/p/android/issues/detail?id=186160
headsvk

21
Esto es ridículo. Me tomaría menos tiempo crear un fragmento de preferencias desde cero que encontrar una manera de resolver todos los errores, soluciones y pruebas necesarias para que esto funcione al 100% en todas las versiones.
Edward van Raak

46

Tienes que especificar preferenciaTheme en el tema de tu actividad de preferencia.

Por ejemplo :

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

PreferenceThemeOverlay es el tema predeterminado que viene con la biblioteca de soporte preferencia-v7.


14
Esto funciona, pero parece incorrecto. Las fuentes de los elementos de preferencia son demasiado grandes (probado en Android 4.1 y 5.1).

@ mus65 Ese es el problema. Supuse que debería usar ese tema, pero se ve mal. Agregué más detalles a la pregunta original.
Intricaciones

3
He seleccionado esta como la respuesta correcta porque fue la primera que dijo el tema correcto para configurar. Sin embargo, la biblioteca de soporte debe arreglarse para que las preferencias utilicen material design de acuerdo con code.google.com/p/android/issues/detail?id=183376
Intrications

¿Cómo hago para que el tema se vea como material-design? Actualmente me muestra el aspecto nativo ...
desarrollador de Android

1
Lea mi respuesta a continuación.
Gergely Kőrössy

35

Parece que Google solucionó este problema. He probado esto con la preferencia v14-support versión 25.3.1

1) Agregar implementation 'com.android.support:preference-v14:25.3.1' a su Gradle.

2) Agregue PreferenceThemeOverlay.v14.Materialal estilo en lugar de PreferenceThemeOverlay.

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

3) Finalmente, agregue el estilo al Manifiesto

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

El único problema con esta respuesta es que el fragmento de preferencia utilizará el tema de material en los sistemas que ejecutan KitKat e inferiores. Ajuste preferenceThemea PreferenceThemeOverlay.v14en styles.xmly PreferenceThemeOverlay.v14.Materialen styles-v21.xmlsoluciona el problema.
Jack Meister

@JackMeister, solo debe usar la versión v14 si tiene como objetivo el nivel de API 14 o superior. Es posible que la incompatibilidad de temas con versiones anteriores no sea su único problema cuando usa v14 con niveles de API anteriores.
Jelmer Brands

@JelmerBrands Seguro: no debería usar una biblioteca de soporte v14 en sistemas que ejecutan niveles de API por debajo de 14. Mi comentario asume minSdkVersionentre 14 y 20.
Jack Meister

Probado con 23.4.0, que funciona igual de bien. Usar la preferencia v14, no la preferencia v7, es la clave.
user149408

14

Para usar PreferenceFragmentCompat , debe establecer preferenceThemesu tema:

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

De esta manera, puede personalizar el preferenceThemeestilo de los diseños utilizados para cada tipo de preferencia sin afectar otras partes de su actividad.


Asegúrese de que está agregando preferenciaTheme al estilo correcto que está configurado como tema para su actividad stackoverflow.com/a/40736138/1572286
Youness

14

Acabo de agregar esta línea en el tema y funciona perfectamente en API 19 y superior.

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

3
Esta es la solución más simple y funcional, que no requiere dependencia adicional. Debería ser la respuesta aceptada en mi humilde opinión, ahora que la mayoría de las aplicaciones son mínimas API 14+
Louis CAD

Android Studio no puede encontrar esto
Denny

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

3

Solución que me funcionó en API 25. Tenía este tema predeterminado:

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

Y le agregué esta línea

<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 ya estaba definido, no tuve que incluirlo. Funcionó en mis propios dispositivos Android 4.xy 5.x


2

Agregue este código a su styles.xml y modifíquelo según. Debería funcionar bien.

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

Agregué el elemento "priorityTheme" en mi estilo y eso pareció solucionar el 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

El sitio más útil para mí: Medio

El autor muestra que necesitamos agregar dos paquetes: com.android.support:preference-v7ycom.android.support:preference-v14 , porque el primero se distribuye sin estilos.

Déjame saber si funciona


0

El "Takisoft Fix" aceptado parece bastante torpe y después de jugar con él, todavía no estoy satisfecho con el aspecto resultante.

Si necesita la PreferenceFragmentbiblioteca de soporte API 9+ , le recomiendo usar la biblioteca de soporte de preferencia de material . Funciona perfectamente (al menos para mí).


0

El problema se produce porque la AAPT (herramienta de empaquetado de activos de Android) no puede encontrar algunos recursos. Solucione este problema de la siguiente manera:

1.Copie los recursos que son necesarios en una nueva carpeta de recursos de respuesta, denominada como res_fw_v7_preference u otra cosa.

2.Usando gradle para construir tu aplicación y agregar algunas opciones AAPT adicionales en build.gradle (módulos) como este:

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

Espero que esto sea útil :)


0

Gracias @sergio por la respuesta, usar en <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>lugar de <item name="preferenceTheme">@style/Preference</item>funciona muy bien para mí.

<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

Déjelo ir y use API 11+.

API 7 ya tiene casi siete años.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.