Je développe un Activity
où je dois rendre la barre de navigation opaque et la barre d'état transparente sur les appareils exécutant la version 5.0+ (API 21+). Les styles que j'utilise sont ci-dessous, avec une explication de mon problème.
AppTheme
étend Theme.AppCompat.Light.NoActionBar
<item name="Android:statusBarColor">@color/transparent</item>
<item name="Android:windowActionBar">false</item>
<item name="Android:windowDrawsSystemBarBackgrounds">true</item>
<item name="Android:statusBarColor">@color/welbe_red_transparent</item>
FullscreenTheme
étend AppTheme
<item name="Android:windowNoTitle">true</item>
<item name="Android:statusBarColor">@color/transparent</item>
<item name="Android:windowTranslucentNavigation">true</item>
Cela donne à l'application l'apparence suivante
Si je supprime le Android:windowTranslucentNavigation
style, ou définissez-le sur false
dans Fullscreen
, cela résout le problème de la barre de navigation. Le problème est que la barre d'état devient complètement blanche au lieu de rester transparente et d'afficher le contenu derrière elle.
J'ai essayé d'utiliser fitsSystemWindow="true"
dans mes mises en page, mais cela n'a pas résolu le problème. quelquun sait pourquoi cela se passe?
Android:windowTranslucentNavigation
fait une chose qui Android:statusBarColor
ne fait pas ce qui demande SYSTEM_UI_FLAG_LAYOUT_STABLE
et SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
drapeaux.
Ce sont ceux que vous devez demander afin de vous placer derrière la barre d'état.
Demandez-les dans le onCreate
de votre Activity
:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Alternativement, vous pouvez également simplement définir l'arrière-plan du thème de vos applications et cela apparaîtra également derrière votre barre d'état.
Plus d'informations ici .
Pour autant que je sache, il n'existe aucun moyen approprié de définir la couleur de la barre d'état sur les API inférieures à 19.
Pour l'API 19+, vous pouvez utiliser un attribut similaire à windowTranslucentNavigation
uniquement pour la barre d'état:
<item name="Android:windowTranslucentStatus">true</item>
Remarques:
La raison pour laquelle vous obteniez une barre d'état blanche est due à
<item name="Android:statusBarColor">@color/transparent</item>
Il y a certains hacks qui fonctionnent sur des appareils spécifiques du fabricant, mais je ne les utiliserais pas moi-même.
Je lutte avec cela depuis plus de 3 heures. Enveloppez tout dans un CoordinatorLayout c'est le seul qui semble prêter attention à la fitSystemWindow = "true" ou "false"
Ceci est mon principal fragment d'activité
<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/content_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<include layout="@layout/layout_google_map"/>
<include layout="@layout/layout_toolbar_transparent"/>
<include layout="@layout/layout_action_buttons"/>
<include layout="@layout/layout_bottom_sheet"/>
</Android.support.design.widget.CoordinatorLayout>
c'est ma disposition de barre d'outils
<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<Android.support.v7.widget.Toolbar
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@Android:color/transparent"
Android:theme="@style/ToolbarTheme"
app:popupTheme="@style/AppTheme.PopupOverlay">
<Android.support.v7.widget.AppCompatImageView
Android:layout_width="wrap_content"
Android:layout_height="?actionBarSize"
Android:layout_centerHorizontal="true"
Android:layout_gravity="center"
Android:adjustViewBounds="true"
app:srcCompat="@drawable/ic_fynd_logo_red"/>
</Android.support.v7.widget.Toolbar>
</Android.support.design.widget.CoordinatorLayout>
comme vous pouvez le voir, ma disposition des fragments fait que la carte google soit dessinée sous la barre d'état.
J'ai une barre d'action où va le logo de l'entreprise.
Et d'autres boutons d'interface utilisateur "layout_action_buttons" sont également enveloppés dans une disposition de coordinateur, de sorte que la fonction fitSystemsWindows fonctionne.
Vérifiez-le.
Pour y parvenir dans n'importe quelle activité
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="Android:statusBarColor">@Android:color/transparent</item> <item name="Android:windowBackground">@Android:color/white</item> </style>
Utiliser CoordinatorLayout comme disposition racine en XML
Dans la méthode oncreate (), avant l'utilisation de setcontentview
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE ou View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN