J'ai une activité qui étendre la préfencitance.
Mon thème: Android: Theme = "@ Android: style / thème.light.notitlebar.fr.fr est appliqué au niveau d'application dans le fichier manifeste. P>
Tout obtient le thème souhaité, à l'exception des éléments "PréférencesCrean" de "PreferCeCategory". Ils ont toujours le fond noir par défaut. En mots simples, l'écran de la catégorie de préférences principale qui a les écrans de préférence parent obtient le thème, mais si je clique sur l'une des préférencesCreens pour accéder à leurs préférences d'élément (Editext, etc.), ils ne reçoivent pas le thème ... < / P>
Une idée de la raison pour laquelle cela pourrait se produire? p>
La structure ou les préférences.xml est quelque chose comme ceci: p>
5 Réponses :
C'est un bogue dans les versions antérieures androïdes (voir aussi http: // code.google.com/p/android/issues/detail?id=4611 ). P>
Si je me souviens que les thèmes correctement ne sont pas correctement appliqués à une préférence sur toutes les versions Android 2.x. Un moyen de résoudre ce problème est de régler les couleurs / les polices, etc. vous-même, mais il existe également une solution de contournement décrite dans les commentaires du BugReport. Les thèmes doivent fonctionner correctement sur Android 3.0 et ultérieurement. P>
Comment définissez-vous les couleurs et les polices vous-même?
enfin, j'ai découvert comment changer de thème de "Préférence de la préfencitation" de manière programmatique (via Java Code)
pour changer le thème juste comme ceci: P>
@Override public void onCreate(Bundle savedInstanceState) { setTheme(R.style.Holo_Theme_Light); super.onCreate(savedInstanceState); }
Est-ce possible pour la préférence?
@Override public boolean onPreferenceTreeClick(final PreferenceScreen preferenceScreen, final Preference preference) { // https://code.google.com/p/android/issues/detail?id=4611 comment #35 if (preference instanceof PreferenceScreen && ((PreferenceScreen) preference).getDialog() != null) ((PreferenceScreen) preference).getDialog().getWindow().getDecorView().setBackgroundColor(Color.parseColor("#ffffff")); return super.onPreferenceTreeClick(preferenceScreen, preference); }
En regardant la source de Cela peut nous aider à nous aider de manière substantielle, car tout ce que nous avons à faire est de remplacer la méthode Notez que parce que cette méthode est annotée avec PréférencesCreen # Showdialog (Bundle) CODE>
, nous voyons que la boîte de dialogue est créée à l'aide de la ressource thème obtenue via MCONText.Getthemeresid () code>, qui est ensuite utilisé dans un
ContextHemewrapper Code>.
getthemeresid () code> dans votre activité (qui est caché de l'API publique) , pour fournir notre thème personnalisé, et que les sous-préférencesCrean utilisent désormais toute la ressource de thème personnalisée que nous voulions! p>
@hide < / code>, nous ne pouvons pas utiliser l'annotation
@override code> qui serait normalement utilisée dans ce cas; Et nous ne pouvons également pas appeler à la méthode
Super.Getthemeresid () code>. Si vous vraiment, vraiment em> veux pouvoir le remplacer de manière conditionnelle et faire appel à la super mise en œuvre, vous devrez utiliser la réflexion pour accéder à la méthode de la super implantation: P>
Il faut mentionner que vous devez "remplacer" Getthemeresid () sur votre activité. Cela semble être la seule solution à travailler pour des préférences imbriquées.
Comme toutes les autres réponses tentent de le résoudre à l'aide du code Java, voici comment je l'ai fait complètement en utilisant XML et sans déclarer ma propre classe de préférences.
J'ai d'abord copié la mise en page complète pour une préférence de maintenant dans l'Apptheme, une nouvelle entrée de préférence: p> < Pré> xxx pré> Maintenant pour cette nouvelle mise en page, tous les styles que vous voulez.
C'est tout. P> p> "@ + Android: id / xyz " code> à
" @ Android: id / xyz " code>. Ensuite, dans mon fichier de styles, j'ai déclaré un nouveau style comme suit: p>
Très flexible, merci. C'est un excellent point de départ pour quiconque cherche à personnaliser les préférencescreen sans que tout réécrit à partir de zéro.