implement example dialogpreference custom activity android android-fragments android-support-library preferencefragment preference-v7

example - implement settings android



PreferenceFragmentCompat requiere preferencia El tema a configurar (13)

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

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

¿Qué tema se debe 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.

Biblioteca de soporte:

Preferencias nativas:


El proyecto de muestra se puede encontrar aquí

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

Ahora uno puede usar la biblioteca bastante fácil. Aquí hay una 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. Use la clase apropiada como base de su fragmento

Puede usar PreferenceFragmentCompat o PreferenceFragmentCompatDividers .

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

3. Use el tema apropiado

Establezca el tema de su Actividad contenida 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 condujo a la creación de la biblioteca, pero decidí eliminarla porque podría ser confusa. Si tiene curiosidad sobre los pasos, aún puede encontrarlos en el historial de revisiones de esta respuesta.


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>


Agregué el elemento "PreferTheme" a 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>


Agregue este código a su styles.xml y modifíquelo según corresponda. 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>


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 biblioteca de soporte API 9+ PreferenceFragment , le recomiendo usar la Biblioteca de soporte de preferencias de material . Funciona perfectamente (al menos para mí).


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

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

Déjame saber si funciona


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

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


Para usar el PreferenceFragmentCompat , debe establecer el preferenceTheme en su tema:

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

De esta forma, puede personalizar el tema de preferenceTheme para diseñar los diseños utilizados para cada tipo de preferencia sin afectar otras partes de su actividad.


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

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

2) Agregue PreferenceThemeOverlay.v14.Material al 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"


Solo déjalo ir y usa API 11+.

API 7 tiene casi siete años ahora.


Solución que funcionó para mí en la 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 dispositivos Android 4.xy 5.x propios


Tiene que especificar preferenciaTheme en el tema de su 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 de preferencia-v7.


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 sean necesarios para una nueva carpeta de recursos de respuesta, denominada res_fw_v7_preference u otra cosa.

2.Utilizando gradle para construir su aplicación y agregar algunas opciones adicionales de AAPT en build.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 útil :)