web-dev-qa-db-fra.com

La barre d'état transparente ne fonctionne pas avec windowTranslucentNavigation = "false"

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

Android:windowTranslucentNavigation="true"

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.

Android:windowTranslucentNavigation="false"

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?

37
Austyn Mahoney

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 .

65
Jeroen Mols

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.

5
Simas

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.

enter image description here

2
Pedro Varela

enter image description here

Pour y parvenir dans n'importe quelle activité

  1. Ajoutez le style:
 <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>
  1. Utiliser CoordinatorLayout comme disposition racine en XML

  2. 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

0
KishanSolanki124