PreferenceFragmentCompat requiere preferenceTheme se establezca

Con la nueva PreferenceFragmentCompat de la v7 Preferencia de la Biblioteca de Soporte: http://developer.android.com/tools/support-library/features.html#v7-preference, me sale este error

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

Del tema que se deben establecer?

Actualización: he intentado usar

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

según lo sugerido por @Bogato pero no se ve bien y se ve muy Holo incluso en Lollipop.

De la biblioteca de soporte:

PreferenceFragmentCompat requiere preferenceTheme se establezca

Nativo de preferencias:

PreferenceFragmentCompat requiere preferenceTheme se establezca

InformationsquelleAutor Intrications | 2015-08-18

13 Kommentare

  1. 159

    El proyecto de ejemplo se puede encontrar aquí

    La corrección de errores está disponible como un gradle dependencia

    PreferenceFragmentCompat requiere preferenceTheme se establezca

    Ahora uno puede usar la biblioteca bastante fácil. Aquí hay manera más rápida de hacerlo, pero deberá consultar el archivo LÉAME para obtener más información.

    1. Actualización del módulo gradle archivo:

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

    2. El uso de la clase apropiada como su fragmento de la base

    Usted puede utilizar cualquiera de los PreferenceFragmentCompat o PreferenceFragmentCompatDividers.

    (El reloj hacia fuera para el apropiado nombre de paquete, cuando la importación de PreferenceFragmentCompat!)

    3. En el tema

    Conjunto que contiene su Actividad el tema de una variante de la @style/PreferenceFixTheme, como NoActionBar, Luz, etc.

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


    P. S. En este apartado podrá encontrar la solución que llevó a la creación de la biblioteca, pero decidí quitarlo, ya que puede ser confuso. Si eres curioso acerca de los pasos, usted puede todavía encontrar en la historial de revisiones de esta respuesta.

    • El tamaño de texto por defecto es demasiado grande, he intentado modificar el uso de estos estilos se señaló, sin éxito. ¿Quizás gestionar para ajustar el tamaño del texto?
    • Esto produce el mismo resultado que sólo el uso de Bogato la respuesta de la configuración <item name=»preferenceTheme»>@style/PreferenceThemeOverlay</item> directamente en el tema. Como @Tinashe dice, los estilos son incorrectos.
    • Estoy tratando de poner el diseño de materiales, pero no es muy acertado… Lo que he descubierto durante el proceso es que la v7 preferencia pack falta completamente el material temático de estilo, diseño y otros archivos. Mientras tanto, la v14 contiene algunos de ellos, pero el problema con la v14 es que se extiende el nativo Fragmento, no el apoyo de uno. Creo que Google acaba de hacer un gran error aquí, esperemos que solucionarlo lo antes posible…
    • Gracias por la actualización de la muestra. Funciona muy bien para mí. Parece que debería ser fácil para el apoyo de la biblioteca a ser fijo.
    • Yo podría tratar de poner en el diseño de materiales en el lugar de pre-21 de dispositivos así, ellos tienen el mismo aspecto que el original ahora.
    • Hola, he utilizado el atributo @style/PreferenceThemeOverlay.v14.Material, pero sólo funciona en xml Preferencias. Cuando trato de crear y agregar una preferencia en tiempo de ejecución, se tiene que horrible estilo. ¿Sabes cómo solucionarlo?
    • Hacer que crear una instancia de la edad de Preferencia de la clase o el soporte de uno?
    • He utilizado la nueva android.support.v7.preferences.Preference
    • He publicado mi pregunta, puedes darle un vistazo, por favor?
    • El proyecto Android-Support-de Preferencia-V7-Fix ha minSdkVersion: 16 supongo que no funciona en el nivel de la API de 10…
    • Usted puede intentar, no creo que tenga nada que requeriría mayor de la API de niveles (por supuesto, usted podría tener que mover el actual genérico styles.xml para un más adecuado (es decir, la versión calificado) directorio y crear uno para el bajo de la API de niveles). Yo no objetivo por debajo de los 16 sólo porque creo que cualquier cosa por debajo de eso está obsoleto.
    • Cuando la dependencia » com.android.soporte:de preferencia-v14:23.0.1′, el manifiesto de la fusión se queja de que minSdkVersion debe ser de al menos 14…
    • Bien, sí. A continuación, puede utilizar el material temático y a nivel de API <14 juntos. Por desgracia, los chicos de Google no me importa, / esta es una tarea de baja prioridad…
    • ¿tienes una idea de por qué no existen las líneas divisorias entre los elementos de preferencia?
    • Es resultado de un cambio de ListView para RecyclerView. Los devs nos dijo que van a conseguir estos artefactos cleand para la próxima versión.
    • Gracias por proporcionar un GitHub del proyecto para demostrar la solución. Es muy útil tener un mínimo viable ejemplo como solución.
    • Por cierto, ¿hay alguna manera de que podamos hacer que esto funcione, para la API de 10 y más arriba?
    • el utilizado PreferenceThemeOverlay.v14.Material preferencia tema es, obviamente, para la API 14+ dispositivos, de manera que uno no puede ser utilizada en dispositivos de nivel inferior. Sin embargo, mi enfoque original (el uso personalizado de diseño de los archivos copiados desde el proyecto de apoyo a la) puede ser usado, con algunos cambios adicionales. Si hay una alta demanda, que podría intentar ponerlo en práctica, pero sería mejor si Google hizo que, a pesar de que dijo que nadie realmente se preocupa por portar material de estilo para los dispositivos antes de la API de 14.
    • De hecho, realmente no me importa si v10 es tener material mirada. Yo estoy bien si v10 cae de nuevo a la apariencia predeterminada. Sólo que, mediante la inclusión de v14 lib, voy a tener error de compilación, si mi min sdk es de 10.
    • Sí, no sé por qué los chicos de Google no puede ver el problema… he probado la última 23.1.0 versión y corrige algunos de los errores, pero muchos de ellos todavía están allí. La normal @style/PreferenceThemeOverlay todavía utiliza los viejos estilos, incluso en la API de 21+ dispositivos.
    • tengo el mismo problema. La normal @style/PreferenceThemeOverlay todavía utiliza los viejos estilos, incluso en la API de 21+ dispositivos. Puede existir una solución para esto? He probado todos los consejos que escribí en este hilo.
    • La única solución (además de la espera de Google para solucionarlo – pero parece que no) es implementar una costumbre PreferenceTheme que los usos adecuados de archivos de diseño y material de los estilos en las plataformas.
    • He creado una solución que facilita el trabajo en la API de 7+ también, mientras mantiene el material de estilos en la API de 14+ dispositivos. Publicado el fix aquí y también se actualiza el proyecto de ejemplo para que usted pueda probar que en los dispositivos. Sólo he tenido la oportunidad de probarlo en la API de 10 emulador.
    • Genial…voy a probar tu solución. Cuando llego a un resultado, a dar una respuesta. Lo siento por el retraso, no he recibido el correo electrónico de notificación por tu respuesta. Gracias
    • La solución trabajó como un encanto. Buen trabajo. Gracias por compartir. El listview divisor no se mostró, mi fragmento de fondo es de color negro. ¿Tiene usted alguna sugerencia?
    • El divisor no es parte de la implementación, debido a la naturaleza genérica de la RecyclerView, sin embargo, puede ser implementado utilizando ItemDecoration (que no es lo ideal y se come la CPU/GPU). Sobre el fondo negro: ¿utiliza un AppCompat la Luz el tema como su tema principal? Si no, podría conducir a este problema.
    • No, yo uso el Tema.AppCompat.NoActionBar como mi tema principal, pero traté de usar AppCompat Luz, sin éxito.
    • Puede ver esto en todos los niveles de la API de o justo por debajo de los 14? En el emulador, el fondo es blanco por todas partes (API 10, 16, 22), al menos en mi proyecto de ejemplo.
    • Lo siento por mi retraso de respuesta de nuevo. El listview divisor no aparece en todas partes. En el momento, estoy trabajando en otro proyecto, pero pondrá a prueba pronto como sea posible de nuevo. Gracias por ahora
    • Si usted todavía está interesado en la divisores, he implementado esta característica ahora. Echa un vistazo a la problema.
    • <item name="android:textColor">@color/accent_selector</item> cambio <item name="android:textColor">@color/colorAccent</item> tal vez mejor
    • ¿a qué te refieres?
    • Kőrössy, Para la v7, accent_selector.xml es redundante, puede utilizar colorAccent definido en styles.xml, <item name="android:colorAccent">@color/accent</item> referencia
    • Bien, parece que ahora funciona. He probado con un solo color anterior y se dio un error de tiempo de ejecución que dijo que se requiere un color de la lista estado, no solo de un color. Probablemente se actualiza la categoría de preferencia de los atributos del procesamiento. Gracias.
    • Kőrössy Gracias. Miro a su v14/styles.xml me doy cuenta de que usted está usando android:fontFamily. No es android:fontFamily requiere de la API de 16?
    • Kőrössy : puedo entender por qué la necesidad de u preference_fallback_accent_color en colors.xml . Sin embargo, ¿qué pasa si mi aplicación contiene 2 temas con los que el usuario puede cambiar durante el tiempo de ejecución? Necesitamos tener diferentes preference_fallback_accent_color valor cuando la aplicación está en otro tema. Puedo saber que es posible alcanzar tal?
    • Sí, está disponible a partir de la API de 16, pero no importa como se acaba de ignorar ese atributo en 14-15. No lo he probado todavía en los dispositivos de aunque.
    • Es posible, agregó la revisión del proyecto en la repo.
    • También cabe mencionar que el PreferenceFragmentCompat se bloquea si se rota con un diálogo abierto. code.google.com/p/android/issues/detail?id=186160
    • Es un problema conocido y será corregido en la próxima versión, y no hay nada que uno pueda hacer al respecto ahora mismo, por eso yo no los mencionó.
    • ¿cómo puedo reemplazar el android:textAppearanceLarge (títulos) y android:textAppearanceSmall (resúmenes)? Podrías dar algún ejemplo? Cuando yo intente hacer algo como que: ` <style name=»MyPreferenceStyle» parent=»PreferenceThemeOverlay.v14″> <item name=»android:textAppearanceLarge»>16sp</item> </style>` me da un error.
    • El problema con tu código es que android:textAppearanceLarge está a la espera de un TextAppearance «objeto», no solo un valor de tamaño. Consulte el Estilos y Temas guía para más información.
    • Esto es ridículo. Me llevaría menos tiempo para hacer una preferencia fragmento de cero que encontrar un camino a través de todos los errores, soluciones y las pruebas necesarias para hacer este trabajo 100% en todas las versiones.
    • Estaría interesado en una versión donde el Fix final no es necesario en las preferencias de XML?
    • ¿Su interruptor de preferencia compat ve como la mierda con la última de la biblioteca?
    • ¿A qué te refieres? Se ve la misma.
    • empezó a mirar así para mí, se veía bien, hace pocas semanas. ¿SwitchPreference el mismo aspecto como SwitchPreferenceCompat por debajo de la L? Es holo de estilo para mí, pero todo lo demás se ve material.
    • Enviar un problema de aquí con capturas de pantalla y el dispositivo / versión de Android que está utilizando. Se ve bien en 5.0 para mí.
    • He investigado el tema y parece que sólo se consigue con la depuración de configuración instantánea y de ejecución, la liberación se ve bien, raro
    • Tanto esfuerzo puesto en la depuración de… en Serio, está roto, mucho mejor para hacer su propio. Google ha fallado.
    • android:inputType=»número» no funciona con EditTextPreference. Me muestra el teclado normal. Soy yo el único que no funciona?
    • Se debe trabajar a menos que usted use el nombre completo de EditTextPreference. Lo que en el XML?
    • Funciona si cambio inputType al teléfono?
    • Nope. Todavía me muestra el teclado normal
    • Probablemente usted está utilizando el PreferenceFragmentCompat del paquete original. Asegúrate de que sea en com.takisoft.fix.support.v7.preference.
    • Usted está completamente a la derecha. No me di cuenta. Gracias!!
    • Esta biblioteca se congela mi app
    • ¿Qué quieres decir, se congela la aplicación?

  2. 45

    Usted tiene que especificar preferenceTheme en su preferencia de actividad del tema.

    Por ejemplo :

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

    PreferenceThemeOverlay es el tema por defecto que viene con preferencia-v7 apoyo de la biblioteca.

    • Esto funciona, pero se ve mal. Las fuentes de la preferencia de los elementos son demasiado grandes (probado en android 4.1 y 5.1).
    • Ese es el problema. Yo había pensado que yo debería usar ese tema, pero se ve mal. He añadido más información a la pregunta original.
    • He seleccionado esta como la respuesta correcta porque fue el primero que dijo que el correcto tema a definir. Sin embargo, el apoyo de la biblioteca no necesita ser arreglado de manera que las preferencias de uso diseño de materiales de acuerdo a la code.google.com/p/android/issues/detail?id=183376
    • ¿Cómo puedo hacer el tema del aspecto material-diseño? En la actualidad se muestra el nativo me buscan…
    • Lee mi respuesta a continuación.
  3. 35

    Parece como Google corrigió este problema. He probado con la preferencia v14-soporte de la versión 25.3.1

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

    2) Agregar PreferenceThemeOverlay.v14.Material para el estilo en lugar de PreferenceThemeOverlay.

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

    3) por último, agregar el estilo del Manifiesto

    android:theme="@style/AppTheme.SettingsTheme"
    • El único problema con esta respuesta es que la preferencia fragmento va a utilizar el material del tema en los sistemas que ejecutan KitKat y abajo. Configuración de preferenceTheme a PreferenceThemeOverlay.v14 en styles.xml y PreferenceThemeOverlay.v14.Material en styles-v21.xml soluciona el problema.
    • sólo debe utilizar la versión v14 si el destino de la api de nivel 14 o superior. Tema de incompatibilidad con versiones anteriores no puede ser su único problema al utilizar v14 con mayores api niveles.
    • Seguro: usted no debería usar un v14 de la biblioteca de soporte en sistemas de ejecución de la API de niveles por debajo de 14. Mi comentario supone un minSdkVersion entre 14 y 20.
    • Probado con 23.4.0, que funciona igual de bien. El uso de la v14-de preferencia, no v7-de preferencia, es la clave.
  4. 14

    El uso de la PreferenceFragmentCompat tiene que establecer preferenceTheme en el tema:

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

    De esta manera usted puede personalizar el preferenceTheme el estilo de los diseños utilizados para cada tipo de preferencia sin afectar a otras partes de su Actividad.

  5. 14

    Acabo de añadir esta línea en el tema y funcionando perfecto sobre la API 19.

    <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
    • Esta es la más simple, la solución de trabajo, que no requiere de dependencia adicional. Debe ser aceptado respuesta en mi humilde opinión, ahora que la mayoría de las aplicaciones están min API 14+
    • Android studio no se puede encontrar este
    • añadir com.android.soporte:de preferencia-v14: para construir.gradle
  6. 3

    Solución que trabajó para mí en la API de 25. Yo tenía este tema por defecto:

    <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 añade 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 se fue ya definido, no tenía que incluirlo.
    Se trabajó en Android 4.x y 5.x dispositivos de mi propia

  7. 2

    Agregar este código a su styles.xml y modificar de acuerdo. 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>

  8. 1

    He añadido el «preferenceTheme» elemento en mi estilo y en la que parecía 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>
    • votada abajo, porque simplemente se bloquea y no funciona
  9. 1

    Los más útiles sitio para mí: Medio

    Autor muestra que tenemos que añadir dos paquetes: com.android.support:preference-v7 y com.android.support:preference-v14, porque el primero que se distribuyan sin estilos.

    Hágamelo saber si funciona

  10. 0

    El problema se produce porque la AAPT(Android Asset Packaging Tool) no puede encontrar algunos recursos. Solucionar este problema de la siguiente manera:

    1.Copia de los recursos que son necesarios para una nueva respuesta de la carpeta de recursos, denominado como res_fw_v7_preference o algo más.

    2.El uso de gradle para construir su aplicación y añadir algo de AAPT opciones en construir.gradle(módulo) 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 de ayuda:)

  11. 0

    Gracias @sergio por responder, utilizando <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> en 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>

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...