web-dev-qa-db-fra.com

android: fitsSystemWindows ne fonctionne pas

Dans mon thème, j'ai défini les règles suivantes pour dessiner mes vues derrière la barre d'état:

<item name="Android:statusBarColor">@Android:color/transparent</item>
<item name="Android:windowDrawsSystemBarBackgrounds">true</item>

Et dans l'activité (onCreate):

getWindow.getDecorView.setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
)

Ensuite, dans ma vue, j'utilise un scanner de codes barres qui est supposé dessiner derrière la barre d'état, ce qui fonctionne. Cependant, lorsque j'applique le Android:fitsSystemWindows à une vue enfant, sa position n'est pas ajustée. Cela fonctionne quand je l'applique à l'élément racine, cependant.

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
             Android:layout_width="wrap_content"
             Android:layout_height="wrap_content">

    <my.Scanner
        Android:id="@+id/scanner"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <FrameLayout Android:layout_width="match_parent"
                 Android:layout_height="match_parent"
                 Android:fitsSystemWindows="true"> <!-- Should receive a top padding, right? -->

        <View Android:layout_width="50dp"
              Android:layout_height="50dp"
              Android:background="@color/red" />

    </FrameLayout>

</FrameLayout>

Screenshot

16
Taig

Mon problème était très probablement lié aux attributs fitsSystemWindows multiples/imbriqués qui ne fonctionnent pas comme je l’ai découvert plus tard. J'ai résolu mon problème en appliquant l'attribut à une vue, puis en copiant les rembourrages dans d'autres vues qui en ont besoin via un ViewTreeObserver.OnGlobalLayoutListener. C'est un bidule laid, mais fait son travail pour l'instant.

13
Taig

Utilisez CoordinatorLayout comme racine pour votre vue, cela a fonctionné pour moi.

<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">
17
Ali Karaca

Je rencontre le même problème dans Android 4.4

Mon problème est <item name="Android:windowTranslucentStatus">true</item>

conflit avec <item name="Android:fitsSystemWindows">true</item>

Mon chemin est supprimer <item name="Android:windowTranslucentStatus">true</item>

2
Ninja

pour moi le problème était que le clavier cache un champ editText qui est placé à la fin de l'activité ..J'ai essayé toutes les solutions et rien ne marche ..__ J'utilisais ce code avant l'appel à la méthode setContentView() la barre d'état transparente:

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
            Window w = getWindow(); // in Activity's onCreate() for instance
            w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        }

Je l'ai enlevé et également supprimé le fichier Android:windowSoftInputMode="adjustResize|adjustPan" from the maneifest et maintenant cela fonctionne.

0
Mohammed Fathi