132 votes

Définir le thème d'un fragment

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 renvoyer à un exemple codé ? Je ne trouve rien.

9voto

sebster Points 374

Assurez-vous que vous avez android:minSdkVersion="11" dans votre manifeste. Cela pourrait être la raison pour laquelle David L'exemple n'a pas marché pour vous.

De même, définissez le android:theme="@android:style/Theme.Holo.Light" de l'attribut <application> et PAS le site <activity> étiquette.

Un autre problème possible pourrait être la façon dont vous obtenez votre Contexte lorsque vous utilisez une ContextThemeWrapper() . Si vous utilisez quelque chose comme getActivity().getApplicationContext() il suffit de le remplacer par getActivity() à la place.

Normalement, le Theme.Holo doit s'appliquer aux fragments liés à l'activité principale.

Veuillez noter que vous utilisez un ContextThemeWrapper lorsque vous souhaitez appliquer une stratégie de gestion de l'environnement. différents thème pour votre Fragment. Il serait utile que vous fournissiez le morceau de code, à partir de votre activité principale, où vous ajoutez vos fragments.

Quelques liens utiles :

Le ListView personnalisé dans le fragment n'adhère pas au thème parent

8voto

avi Points 91

J'ai essayé la solution proposée par David, qui fonctionne mais pas dans tous les cas :
1. pour le premier fragment qui a ajouté à la pile a le thème de l'activité et pas celui qui a défini dans onCrateView , mais sur le deuxième fragment que j'ai ajouté à la pile correcte eux a été appliquée sur le fragment.

2. Sur le deuxième fragment que le them était affiché correctement, j'ai fait ce qui suit : j'ai forcé l'application à être fermé par le nettoyage de la mémoire, ré-ouvrir l'application et quand l'activité a été recréé avec le fragment Le fragment a changé le them faux them de l'activité et pas le même qui a été fixé dans le onCrateView du fragment.

Pour résoudre le problème, j'ai effectué une petite modification et remplacé l'argument du conteneur de l'inflater.inflate par un null.

Je ne sais pas comment le gonfleur utilise dans certains scénarios le contexte de la vue du conteneur.

Notez que j'utilise Android.support.v4.app.Fragment et Android.support.v7.app.AppCompatActivity.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle   savedInstanceState) {

// create ContextThemeWrapper from the original Activity Context with the custom theme 
final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme);

// clone the inflater using the ContextThemeWrapper 
LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);

// inflate the layout using the cloned inflater, not default inflater 
return localInflater.inflate(R.layout.yourLayout, null, false);
}

0 votes

Merci, votre solution me sauve. Le thème de mon DialogFragment était en quelque sorte différent de celui des autres fragments. Cela a rendu mon EditText bizarre parce que j'ai utilisé l'inflateur fourni. J'ai trouvé quelques aides concernant ContextThemeWrapper mais ils n'ont pas montré comment faire. Votre solution fonctionne pour moi. Merci beaucoup.

7voto

cbizzy Points 81

Je sais que c'est un peu tard mais cela pourrait aider quelqu'un d'autre parce que cela m'a aidé. Vous pouvez également essayer d'ajouter la ligne de code ci-dessous dans la fonction onCreatView du fragment.

    inflater.context.setTheme(R.style.yourCustomTheme)

3 votes

Cela a fonctionné pour moi mais je me demande si cette approche peut avoir des effets secondaires sur d'autres vues. Dans mon cas, le contexte est l'activité principale (MainActivity), et je dois donc remplacer le thème de l'activité principale. Est-ce que cela a un sens ?

2voto

Devam03 Points 121

Créez une classe java et utilisez la mise en page dont vous voulez changer le thème dans la méthode onCreate, puis mentionnez-la dans le manifeste comme d'habitude.

2voto

Siddharth Sheth Points 157

Si vous voulez juste appliquer un style pour un fragment particulier, il suffit d'ajouter ces lignes avant d'appeler onCreateView() ou onAttach() du fragment,

getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT);

et si vous voulez définir une barre d'état transparente, définissez alors faux à fitsSystemWindows de votre modèle Root,

android:fitsSystemWindows="false"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X