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:
Preferencias nativas:
Respuestas:
La corrección de errores está disponible como una dependencia de Gradle
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
PreferenceFragmentCompat
oPreferenceFragmentCompatDividers
.(¡ 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.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.
fuente
Tienes que especificar preferenciaTheme en el tema de tu actividad de preferencia.
Por ejemplo :
PreferenceThemeOverlay es el tema predeterminado que viene con la biblioteca de soporte preferencia-v7.
fuente
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.Material
al estilo en lugar dePreferenceThemeOverlay
.3) Finalmente, agregue el estilo al Manifiesto
fuente
preferenceTheme
aPreferenceThemeOverlay.v14
enstyles.xml
yPreferenceThemeOverlay.v14.Material
enstyles-v21.xml
soluciona el problema.minSdkVersion
entre 14 y 20.Para usar PreferenceFragmentCompat , debe establecer
preferenceTheme
su tema:De esta manera, puede personalizar el
preferenceTheme
estilo de los diseños utilizados para cada tipo de preferencia sin afectar otras partes de su actividad.fuente
Acabo de agregar esta línea en el tema y funciona perfectamente en API 19 y superior.
fuente
Solución que me funcionó en API 25. Tenía este tema predeterminado:
Y le agregué esta línea
PreferenceThemeOverlay ya estaba definido, no tuve que incluirlo. Funcionó en mis propios dispositivos Android 4.xy 5.x
fuente
Agregue este código a su styles.xml y modifíquelo según. Debería funcionar bien.
fuente
Agregué el elemento "priorityTheme" en mi estilo y eso pareció solucionar el problema:
fuente
El sitio más útil para mí: Medio
El autor muestra que necesitamos agregar dos paquetes:
com.android.support:preference-v7
ycom.android.support:preference-v14
, porque el primero se distribuye sin estilos.Déjame saber si funciona
fuente
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
PreferenceFragment
biblioteca de soporte API 9+ , le recomiendo usar la biblioteca de soporte de preferencia de material . Funciona perfectamente (al menos para mí).fuente
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:
Espero que esto sea útil :)
fuente
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í.fuente
Déjelo ir y use API 11+.
API 7 ya tiene casi siete años.
fuente