J'essaie de définir le thème d'un fragment.
La définition du thème dans le manifeste ne fonctionne pas:
android:theme="@android:style/Theme.Holo.Light"
En regardant les blogs précédents, il semble que je doive utiliser un ContextThemeWrapper. Quelqu'un peut-il me référer à un exemple codé? Je ne trouve rien.
android
android-fragments
android-theme
user1232691
la source
la source
Fragment tire son thème de son activité. Chaque fragment se voit attribuer le thème de l'activité dans laquelle il existe.
Le thème est appliqué dans la méthode Fragment.onCreateView, où votre code crée des vues, qui sont en fait des objets où le thème est utilisé.
Dans Fragment.onCreateView, vous obtenez le paramètre LayoutInflater, qui gonfle les vues, et il contient le contexte utilisé pour le thème, en fait il s'agit de l'activité. Ainsi, vos vues gonflées utilisent le thème d'Activité.
Pour remplacer le thème, vous pouvez appeler LayoutInflater.cloneInContext , qui mentionne dans Docs qu'il peut être utilisé pour changer de thème. Vous pouvez utiliser ContextThemeWrapper ici. Ensuite, utilisez un gonfleur cloné pour créer des vues de fragment.
la source
Pour appliquer un seul style que j'ai utilisé juste
dans
onCreateView()
le fragment avant de gonfler la vue racine du fragment et cela fonctionne pour moi.la source
getContext()
J'essayais également d'afficher ma boîte de dialogue de fragment avec un thème différent de son activité et j'ai suivi cette solution . Comme certaines personnes mentionnées dans les commentaires, je ne le faisais pas fonctionner et le dialogue continuait à s'afficher avec le thème spécifié dans le manifeste. Le problème s'est avéré être que je construisais le dialogue en utilisant
AlertDialog.Builder
dans laonCreateDialog
méthode et que je n'utilisais donc pas laonCreateView
méthode comme indiqué dans la réponse à laquelle j'ai lié. Et quand j'instanciais leAlertDialog.Builder
je passais dans le contexte en utilisantgetActivity()
quand j'aurais dû utiliser l'instancié à laConstextThemeWrapper
place.Voici le code de mon onCreateDialog:
J'ai eu à l'origine l'
AlertDialog.Builder
être instancié comme suit:que j'ai changé en:
Après cette modification, la boîte de dialogue de fragment a été affichée avec le thème correct. Donc, si quelqu'un d'autre a un problème similaire et utilise le,
AlertDialog.Builder
vérifiez le contexte transmis au générateur. J'espère que cela t'aides! :)la source
Assurez-vous que vous avez
android:minSdkVersion="11"
défini dans votre manifeste. Cela pourrait expliquer pourquoi l' exemple de David n'a pas fonctionné pour vous.Définissez également l'
android:theme="@android:style/Theme.Holo.Light"
attribut de la<application>
balise et NON la<activity>
balise.Un autre problème possible pourrait être la façon dont vous obtenez votre contexte lorsque vous utilisez un
ContextThemeWrapper()
. Si vous utilisez quelque chose comme,getActivity().getApplicationContext()
remplacez-le pargetActivity()
.Normalement, le Theme.Holo doit s'appliquer aux fragments liés à MainActivity.
Veuillez noter que vous utilisez un ContextThemeWrapper lorsque vous souhaitez appliquer un thème différent pour votre Fragment. Cela peut aider si vous fournissez le morceau de code, à partir de votre MainActivity, où vous ajoutez vos fragments.
Quelques liens utiles:
La vue de liste personnalisée dans le fragment n'adhère pas au thème parent
la source
J'ai essayé la solution suggérée par David, cela fonctionne mais pas dans tous les scénarios:
1. pour le premier fragment ajouté à la pile, le thème de l'activité et non celui défini dans onCrateView, mais sur le deuxième fragment que je ajouter à la pile les corriger a été appliqué sur le fragment.
2. Sur le deuxième fragment que le leur était affiché correctement, j'ai fait ce qui suit j'ai forcé l'application à être fermée en nettoyant la mémoire, rouvrez l'application et lorsque l'activité a été recréée avec le fragment Le fragment a changé les mauvais eux de l'activité et pas la même que celle définie dans onCrateView du fragment.
Pour résoudre le problème, j'ai fait un petit changement et remplacé l'argument conteneur de inflater.inflate par un null.
Je ne sais pas comment le gonfleur utilise dans certains scénarios le contexte de la vue du conteneur.
Remarque - que j'utilise android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity.
la source
Je sais que c'est un peu tard mais cela pourrait aider quelqu'un d'autre car cela m'a aidé.Vous pouvez également essayer d'ajouter la ligne de code ci-dessous à l'intérieur de la fonction onCreatView du fragment
la source
Créez une classe java, puis utilisez la mise en page dont vous souhaitez modifier le thème dans la méthode onCreate, puis mentionnez-la dans le manifeste comme d'habitude
la source
Si vous souhaitez simplement appliquer un style à un fragment particulier, ajoutez simplement ces lignes avant d'appeler
onCreateView()
ouonAttach()
du fragment,et si vous souhaitez définir la barre d'état transparente, définissez false sur la
fitsSystemWindows
propriété de votre disposition racine,la source
Je l'ai fait fonctionner en définissant le thème sur le contexte du fragment avant d'appeler le gonfleur.
REMARQUE: il s'agit d'un exemple pour Xamarin.Android en combinaison avec MvvmCross. Je ne suis pas sûr à 100% si cela fonctionnera également pour les programmeurs Java. Mais tu peux essayer :)
Le code de la méthode d'extension SetTheme
J'espère que cela aidera certaines personnes, bravo!
la source
J'ai résolu le problème en utilisant
android:theme = "@style/myTheme"
dans le fichier de mise en page du fragment. Par exemple, cela change le style duLinearLayout
et de son contenu, mais rien en dehors duLinearLayout
. Ainsi, afin de décorer le fragment entier avec n'importe quel style, appliquez le thème à sa mise en page parent la plus externe.Remarque: au cas où vous n'avez pas encore trouvé de solution, vous pouvez l'essayer.
la source
vous pouvez essayer ceci pour une sucette dans onAttach
fenêtre finale de la fenêtre = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
et le remettre par défaut dans ondettach
la source