fitSystemWindows par programmation pour la barre d'état de la transparence
Mon application a une activité qui héberge différents fragments pour chaque section. J'ai récemment fait la barre d'état translucide par la mise en fitSystemWindows
à true
, qui a mis de la couleur d'arrière-plan de l'application. C'est très bien pour les fragments qui ont une barre d'outils, où les couleurs correspondent, comme suit:
Cependant, l'un de mes fragments a une photo et un translucides de la barre d'outil, donc j'aimerais avoir la photo d'occuper l'espace de la barre d'état, plutôt que de la couleur d'arrière-plan.
Je crois que la solution est de mettre en fitSystemWindows
à false
pour ce fragment seulement, et l'ajouter manuellement un rembourrage pour le translucide barre d'outils. En faisant par programme ne semble pas avoir d'effet, que pouvais-je fait de mal?
Ici est mon activité principale mise en page:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_parent_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true">
<!-- Container for various fragment layouts, including nav drawer and tool bar -->
</RelativeLayout>
Et de l'intérieur de mon fragment de la onCreateView():
RelativeLayout daddyLayout = (RelativeLayout)getActivity().findViewById(R.id.main_parent_view);
daddyLayout.setFitsSystemWindows(false);
daddyLayout.invalidate();
Cela ne semble avoir aucun effet, comme suit:
Si j'ai mis fitSystemWindows
à false dans le main_parent_view
, la barre d'état rembourrage est parti et il fonctionne, mais évidemment affecte chaque fragment.
Que l'utilisateur du problème, c'est que
fitSystemWindows()
est réinitialisé après un fragment de transaction se produit, alors que mon problème est que je semble incapable de toggle fitSystemWindows()
par programmation. Encore assez similaire, mais aucune de ces réponses ont aidé, très étrange et gênant...Avez-vous trouvez une solution pour ce problème?
Wow c'était il y a longtemps 🙂 j'ai vraiment suggèrent de regarder github.com/jgilfelt/SystemBarTint - bien qu'obsolète maintenant, il a fait beaucoup de ce genre de choses "juste travail" pour moi je pense
OriginalL'auteur Daniel Wilson | 2015-02-07
Vous devez vous connecter pour publier un commentaire.
Vu la même question. Résolu dans mon application en supprimant fitSystemWindows de la déclaration d'activité et l'ajout de paddingTop le fragment. Évidemment pas une solution idéale, mais semble être au travail.
OriginalL'auteur vkislicins
Bien, vous êtes dans le dilemme de la situation, parce que d'une part vous avez besoin d'appliquer des encarts (parce que
Toolbar
doit être correctement rembourré), et d'autre part, vous devriez pas appliquer les encarts (parce que vous voulezImageView
être établi en vertu de la barre d'état).S'avère qu'il y est une belle API fournies par le framework pour ce cas:
En supposant que le répertoire racine de votre mise en page a
android:fitsSystemWindows="true"
, maintenant approprié encarts serait appliqué à votreToolbar
seulement, et pas leImageView
.Mais, il y a un problème.
Le problème est que la racine de votre mise en page est
RelativeLayout
, qui permet de ne pas envoyer ses enfants toutes les informations sur les encarts. Aucun de ses sœurs de mises en page (LinearLayout
,FrameLayout
).Si vous aviez de la racine de la disposition de l'un des "materialish" mises en page (
CoordinatorLayout
,DrawerLayout
), puis les enfants seraient envoyés à ceux de la fenêtre encarts.L'autre option est de la sous-classe
RelativeLayout
et d'expéditionWindowInsets
àles enfants manuellement.
Vous pouvez voir cette réponse pour une explication détaillée, avec précisément la même exigence que vous avez.
OriginalL'auteur azizbekian
Je dois résoudre cette question dans la section 4.4
Cette solution entraîne l'encart dans le tiroir de la mise en page
OriginalL'auteur Kejie Yuan
Vous pouvez utiliser un
CoordinatorLayout
comme votre activité en vue de la racine, puissetFitsSystemWindows(boolean)
fonctionne.C'est parce que, comme expliqué dans ce post de blog ,
DrawerLayout
etCoordinatorLayout
les deux ont des règles différentes sur la façon dontfitsSystemWindows
s'applique à eux - ils tous les deux à l'inset de leur enfant Vues, mais également appeldispatchApplyWindowInsets()
sur chaque enfant, leur permettant d'accéder à lafitsSystemWindows="true"
propriété.C'est une différence avec le comportement par défaut à la mise en page tels que
FrameLayout
où lorsque vous utilisezfitsSystemWindows="true"
est consomme tous les encarts de aveuglément l'application de rembourrage sans en informer les vues enfant (c'est la profondeur de la première partie de l'article du blog).OriginalL'auteur John