Com o novo PreferenceFragmentCompat da biblioteca de suporte de preferências v7: http://developer.android.com/tools/support-library/features.html#v7-preference , recebo este erro
E java.lang.IllegalStateException: Must specify preferenceTheme in theme
E at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:202)
Qual tema deve ser definido?
Atualização: tentei usar
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
como sugerido por @Bogato, mas não parece certo e parece muito Holo mesmo no Lollipop.
Biblioteca de suporte:
Preferências nativas:
android
android-fragments
android-support-library
preferencefragment
preference-v7
Intricações
fonte
fonte
Respostas:
A correção de bug está disponível como uma dependência do Gradle
Agora pode-se usar a biblioteca com bastante facilidade. Aqui está a maneira mais rápida de fazer isso, mas você deve verificar o README para obter mais informações.
1. Atualize o arquivo gradle do seu módulo:
compile 'com.takisoft.fix:preference-v7:27.0.0.0'
2. Use a classe apropriada como base do seu fragmento
Você pode usar
PreferenceFragmentCompat
ouPreferenceFragmentCompatDividers
.( Cuidado com o nome do pacote apropriado ao importar
PreferenceFragmentCompat
! )3. Use o tema apropriado
Defina o tema da atividade que o contém como uma variante de
@style/PreferenceFixTheme
, como NoActionBar, Light, etc.PS Nesta seção você pode encontrar a solução detalhada que levou à criação da biblioteca, mas decidi removê-la porque pode ser confuso. Se você está curioso sobre as etapas, ainda pode encontrá-las no histórico de revisão desta resposta.
fonte
Você deve especificar preferredTheme no tema de sua atividade de preferência.
Por exemplo :
PreferenceThemeOverlay é o tema padrão que vem com a biblioteca de suporte Preferences-v7.
fonte
Parece que o Google corrigiu esse problema. Eu testei isso com a preferência v14-suporte versão 25.3.1
1) Adicione
implementation 'com.android.support:preference-v14:25.3.1'
ao seu Gradle.2) Adicione
PreferenceThemeOverlay.v14.Material
ao estilo em vez dePreferenceThemeOverlay
.3) Por fim, adicione o estilo ao Manifesto
fonte
preferenceTheme
comoPreferenceThemeOverlay.v14
emstyles.xml
ePreferenceThemeOverlay.v14.Material
emstyles-v21.xml
corrige o problema.minSdkVersion
entre 14 e 20.Para usar o PreferenceFragmentCompat, você deve definir
preferenceTheme
em seu tema:Desta forma, você pode personalizar o
preferenceTheme
para definir o estilo dos layouts usados para cada tipo de preferência sem afetar outras partes de sua atividade.fonte
Acabei de adicionar esta linha no tema e está funcionando perfeitamente na API 19 e acima.
fonte
Solução que funcionou para mim na API 25. Eu tinha este tema padrão:
E adicionou esta linha a ele
PreferenceThemeOverlay já estava definido, não precisei incluí-lo. Funcionou em dispositivos Android 4.xe 5.x meus
fonte
Adicione este código ao seu styles.xml e modifique-o de acordo. Deve funcionar bem.
fonte
Eu adicionei o item "preferredTheme" ao meu estilo e isso pareceu resolver o problema:
fonte
O site mais útil para mim: Médio
O autor mostra que precisamos adicionar dois pacotes:
com.android.support:preference-v7
ecom.android.support:preference-v14
, porque o primeiro está sendo distribuído sem estilos.Me avise se funcionar
fonte
O "Takisoft Fix" aceito parece meio desajeitado e depois de brincar com ele, ainda não estou satisfeito com o visual resultante.
Se você precisar da
PreferenceFragment
biblioteca de suporte API 9+ , recomendo usar a Biblioteca de Suporte de Preferência de Material . Funciona perfeitamente (pelo menos para mim).fonte
O problema ocorre porque o AAPT (Android Asset Packaging Tool) não consegue encontrar alguns recursos. Corrija esse problema da seguinte maneira:
1.Copie os recursos necessários para uma nova pasta de recursos de resposta, nomeada como res_fw_v7_preference ou qualquer outra coisa.
2. Usando gradle para construir seu aplicativo e adicionar algumas opções adicionais de AAPT em build.gradle (módulo) como este:
Espero que isso seja útil :)
fonte
Obrigado @sergio pela resposta, usando em
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
vez de<item name="preferenceTheme">@style/Preference</item>
funciona muito bem para mim.fonte
Apenas deixe ir e use a API 11+.
API 7 já tem quase sete anos.
fonte