webentwicklung-frage-antwort-db.com.de

CoordinatorLayout wird auch bei windowTranslucentStatus und fitsSystemWindows nicht hinter der Statusleiste angezeigt

Ich versuche, Ansichten hinter der Statusleiste wie folgt zu zeichnen: Desired result

Ich habe versucht, diesen Effekt mit den empfohlenen Techniken zu erzielen, aber ich bekomme Folgendes:

Actual result

Aus dem Screenshot geht hervor, dass keiner meiner App-Inhalte hinter der Statusleiste angezeigt wird.

Interessant ist, dass der Nav Drawer es irgendwie schafft, hinter der Statusleiste zu zeichnen:

enter image description here

Sachen die ich gemacht habe:

  • Unterstützungsbibliotheks-Widgets verwenden - CoordinatorLayout, AppBarLayout, Toolbar, DrawerLayout
  • windowTranslucentStatus in meinem App-Design auf true gesetzt
  • fitsSystemWindows auf meinem true auf CoordinatorLayout gesetzt

Dies ist mein App-Thema:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <!-- Customize your theme here. -->
  <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@Android:color/transparent</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="Android:windowTranslucentStatus">true</item>
</style>

Dies ist mein Aktivitätslayout:

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <FrameLayout Android:id="@+id/page_container"
                 Android:layout_width="match_parent"
                 Android:layout_height="match_parent"
                 Android:fitsSystemWindows="true"/>

    <Android.support.design.widget.NavigationView
        Android:id="@+id/nav_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</Android.support.v4.widget.DrawerLayout>

Das FrameLayout in meinem Aktivitätslayout wird durch dieses Fragmentlayout ersetzt:

<Android.support.design.widget.CoordinatorLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <FrameLayout Android:layout_width="match_parent"
                 Android:layout_height="match_parent"
                 Android:paddingLeft="@dimen/activity_horizontal_margin"
                 Android:paddingRight="@dimen/activity_horizontal_margin"
                 Android:paddingTop="@dimen/activity_vertical_margin"
                 Android:paddingBottom="@dimen/activity_vertical_margin"
                 Android:background="@Android:color/holo_blue_bright"
                 tools:context=".MainActivity">

        <TextView Android:text="@string/lorem_ipsum"
                  Android:layout_width="wrap_content"
                  Android:layout_height="wrap_content" />
    </FrameLayout>

    <Android.support.design.widget.AppBarLayout
        Android:layout_height="wrap_content"
        Android:layout_width="match_parent"
        app:elevation="0dp"
        Android:theme="@style/AppTheme.TransparentAppBar">

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            Android:background="@Android:color/transparent"
            app:title="@string/hello_blank_fragment"
            app:popupTheme="@style/AppTheme.OverflowMenu" />

    </Android.support.design.widget.AppBarLayout>

    <Android.support.design.widget.FloatingActionButton
        Android:id="@+id/fab"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="bottom|end"
        Android:layout_margin="@dimen/fab_margin"
        Android:src="@Android:drawable/ic_dialog_email" />

</Android.support.design.widget.CoordinatorLayout>
25
Joshua

redigieren Sie für zukünftige Leser: es gibt viele gute Informationen zu dem Thema und das Problem auf den Kommentaren auch, stellen Sie sicher, dass Sie sie lesen.

originale Antwort: Dein Thema ist falsch, deshalb. Leider gibt es Unterschiede bei der Aktivierung in KitKat oder Lollipop. Auf meinem Code habe ich es in Java gemacht, aber Sie können es auch in XML erreichen, wenn Sie mit den Ordnern V21 In Ihrem Ressourcenbaum spielen möchten. Der Name der Parameter ähnelt stark dem von Java).

Löschen Sie den Android:windowTranslucentStatus Aus Ihrem XML und verwenden Sie in Java) wie folgt:

   public static void setTranslucentStatusBar(Window window) {
      if (window == null) return;
      int sdkInt = Build.VERSION.SDK_INT;
      if (sdkInt >= Build.VERSION_CODES.Lollipop) {
         setTranslucentStatusBarLollipop(window);
      } else if (sdkInt >= Build.VERSION_CODES.KitKat) {
         setTranslucentStatusBarKiKat(window);
      }
   }

  @TargetApi(Build.VERSION_CODES.Lollipop)
   private static void setTranslucentStatusBarLollipop(Window window) {
      window.setStatusBarColor(
             window.getContext()
                   .getResources()
                   .getColor(R.color. / add here your translucent color code /));
   }

   @TargetApi(Build.VERSION_CODES.KitKat)
   private static void setTranslucentStatusBarKiKat(Window window) {
      window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
   }

dann kannst du von deiner Aktivität setTranslucentStatusBar(getWindow()); anrufen

edit:

die Statusleiste durchsichtig zu machen und dahinter zu zeichnen (aus irgendeinem Grund verstehe ich das nicht), sind zwei separate Aufgaben in Android.

Ich habe mehr in meinem Code gesucht und bin mir sicher, dass mein Layout VIEL mehr Android:fitsSystemWindows="true" Enthält als nur das CoordinatorLayout.

im Folgenden sind alle Ansichten in meinem Layout mit Android:fitsSystemWindows="true" angegeben:

  • KoordinatorLayout
  • AppBarLayout
  • CollapsingToolbarLayout
  • ImageView (mit dem Hintergrundbild)
  • FrameLayout (mit dem Inhalt des Headers)

daher ist mein Vorschlag, einfach zu testen/versuchen, Android:fitsSystemWindows="true" auf Ihrem XML-Code auszufüllen.

28
Budius
  1. Wenn ich hinter StatusBar zeichnen möchte, verwende ich CoordinatorLayout als übergeordnete Ansicht von Activity (Android : fitsSystemWindows = "false")

styles.xml (v21)

<style name="MyTheme.NoActionBar.TransparentStatusBar">
        <item name="Android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="Android:statusBarColor">@Android:color/transparent</item>
        <item name="Android:windowTranslucentStatus">true</item>
    </style>

Dann Wenn Sie statubarcolor ändern möchten, müssen Sie TRANSLUENT_FLAG wie folgt entfernen

Window window = activity().getWindow();
        if(showTransluent){
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(Color.TRANSPARENT);
        }else {
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(ContextCompat.getColor(activity(), R.color.colorPrimaryDark));
        }
  1. Wenn ich möchte, dass StatusBar durchsichtig ist und gleichzeitig die Ansicht nicht hinter der StatusBar verbirgt, verwende ich FrameLayout als übergeordnete Ansicht mit Argument

Meine styles.xml (v21) aussehen

<resources>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="Android:windowDrawsSystemBarBackgrounds">true</item>
    </style>

    <style name="AppTheme.NoStatusBar" parent="AppTheme.NoActionBar">
        <item name="Android:windowTranslucentStatus">true</item>
        <item name="Android:windowTranslucentNavigation">true</item>
        <item name="windowActionBarOverlay">true</item>
        <item name="Android:windowActionBarOverlay">true</item>
    </style>
</resources>

Und styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Vielleicht ist der entscheidende Punkt hier, um sicherzustellen, dass Sie AppCompactActivity sowie Theme.AppCompact als Root für Ihre Stile verwenden.

0
murt

Das war wirklich verwirrend für mich, aber ich habe es schließlich für meine Kombination von Ansichten herausgefunden, die so aussieht:

<Android.support.v4.widget.SwipeRefreshLayout - **no fitsSystemWindow set**

<Android.support.design.widget.CoordinatorLayout- Android:fitsSystemWindows="true"

<Android.support.design.widget.AppBarLayout - Android:fitsSystemWindows="true"

<Android.support.design.widget.CollapsingToolbarLayout - Android:fitsSystemWindows="true"

<RelativeLayout - Android:fitsSystemWindows="true"

<ImageView - Android:fitsSystemWindows="true"

Ich habe auch die von Budius in meiner App veröffentlichten Methoden verwendet, um die transparente Statusleiste zum Laufen zu bringen:

Löschen Sie den Android: windowTranslucentStatus aus Ihrem XML und verwenden Sie in Java so:

   public static void setTranslucentStatusBar(Window window) {
      if (window == null) return;
      int sdkInt = Build.VERSION.SDK_INT;
      if (sdkInt >= Build.VERSION_CODES.Lollipop) {
         setTranslucentStatusBarLollipop(window);
      } else if (sdkInt >= Build.VERSION_CODES.KitKat) {
         setTranslucentStatusBarKiKat(window);
      }
   }

  @TargetApi(Build.VERSION_CODES.Lollipop)
   private static void setTranslucentStatusBarLollipop(Window window) {
      window.setStatusBarColor(
             window.getContext()
                   .getResources()
                   .getColor(R.color. / add here your translucent color code /));
   }

   @TargetApi(Build.VERSION_CODES.KitKat)
   private static void setTranslucentStatusBarKiKat(Window window) {
      window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
   }
0
Simon