无法将DrawerLayout放在状态栏下方

6
我有一个带有导航抽屉的活动,并使用ScrimInsetsFrameLayout将布局放置在StatusBar下方,一切都完美运行。然后我决定用png背景替换ToolbarStatusBar的颜色,用于所有活动布局。我在模拟器(Nexus 5上的Android 6.0)上运行应用程序,结果与我想要的完全相同,如下面的图像#1所示,但当我在我的设备上尝试(Galaxy Note 3上的Android 5.0)时,ScrimInsetsFrameLayout内部的布局超出了StatusBar 图像#2。我无法理解出了什么问题,请你帮帮我?
这是我的values-v21和我的activity.xml
<style parent="Theme.AppCompat.Light.NoActionBar" name="AppTheme_Activities">

    <item name="android:colorPrimary">@android:color/transparent</item>
    <item name="android:colorPrimaryDark">@color/insetF</item>
    <item name="android:navigationBarColor">@color/insetF</item>
    <item name="android:colorAccent">@color/primary</item>
    <item name="android:colorEdgeEffect">@color/primary</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@color/insetF</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>

</style>



<?xml version="1.0"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/drawer"
    android:fitsSystemWindows="true"
    android:background="@drawable/background"> <!--png image-->

    <FrameLayout
        android:orientation="vertical"
        android:layout_height="match_parent"
        android:layout_width="match_parent">

        <include layout="@layout/toolbar_activities" android:id="@+id/toolbar_layout"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:id="@+id/content_frame">

        </FrameLayout>

    </FrameLayout>

    <com.example.myapplication.ScrimInsetsFrameLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/linearLayout"
        android:layout_width="304dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:insetForeground="#4000"
        android:clickable="true"
        android:background="#ffffff"> .....

    </com.example.myapplication.ScrimInsetsFrameLayout>

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

图片 #1 在此输入图片描述

图片 #2 在此输入图片描述


如果将ScrimInsetsFrameLayoutandroid:fitsSystemWindows设置为false会怎样? - Apostrofix
DrawerLayout 没有延伸到状态栏下方。 - Pier
请查看此链接:https://dev59.com/wl8d5IYBdhLWcg3wxkpq#26440880 它可能会对您有所帮助。 - Srikanth
我尝试了但是没有任何结果... - Pier
2个回答

2

enter image description here

  1. add to your onCreate() of Activity

        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    
  2. Change ScrimInsetsFrameLayout's android:fitsSystemWindows property to false

  3. Remove android:fitsSystemWindows="true" from DrawerLayout

    <android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:id="@+id/drawer"
        android:background="@drawable/background"> <!--png image-->
    
        <FrameLayout
            android:orientation="vertical"
            android:layout_height="match_parent"
            android:layout_width="match_parent">
    
            <include layout="@layout/toolbar_activities" android:id="@+id/toolbar_layout"/>
    
            <FrameLayout
                android:layout_height="match_parent"
                android:layout_width="match_parent"
                android:id="@+id/content_frame">
    
            </FrameLayout>
    
        </FrameLayout>
    
        <com.example.myapplication.ScrimInsetsFrameLayout
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/linearLayout"
            android:layout_width="304dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="false"
            app:insetForeground="#4000"
            android:clickable="true"
            android:background="#ffffff"> .....
    
        </com.example.myapplication.ScrimInsetsFrameLayout>
    
    </android.support.v4.widget.DrawerLayout>
    
  4. Add these styles into your AppTheme_Activities Theme (keeping your status desired color):

            <item name="windowActionBarOverlay">false</item>
            <item name="android:windowActionBarOverlay">false</item>
            <item name="android:fitsSystemWindows">false</item>
            <item name="android:statusBarColor">#4000</item>
    
  5. This will to the state, that Toolbar gets under the StatusBar too, so you'll need to do this hack:

    • Make Toolbar's height = "wrap_content"

      <android.support.v7.widget.Toolbar
           android:id="@+id/toolbar"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:background="?attr/colorPrimary"
           app:popupTheme="@style/AppTheme.PopupOverlay" /> 
      
    • Set Padding for the Toolbar:

      Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
      setSupportActionBar(toolbar);
      toolbar.setPadding(0, getStatusBarHeight(), 0, 0);
      ......
      ......
      public int getStatusBarHeight() {
          int result = 0;
      
          if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
              int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
              if (resourceId > 0) {
                  result = getResources().getDimensionPixelSize(resourceId);
              }
          }
          return result;
      }  
      

就是这样了!

我已经将带有导航抽屉的测试应用程序源代码上传到我的Dropbox中,位于状态栏下方 - 随时查看。

我之前回答过非常类似的问题 - 也许你会发现它也很有用:在Android中具有动态ActionBar颜色的半透明StatusBar

希望能对你有所帮助。


我已经完成了,但现在我的状态栏是透明的。 - Pier
@Pier,应该选择哪种颜色? - Konstantin Loginov
我设置了 _@color/insetF_,它是 app:insetForeground=" #4000 " 的透明颜色。 - Pier
@Pier 请再次确认windowTranslucentStatus已经不在Styles中了,并且statusBarColor已经被设置。 - Konstantin Loginov
让我们在聊天中继续这个讨论 - Konstantin Loginov
显示剩余2条评论

1
我和Pier遇到了同样的问题。烦人的是,似乎没有任何好的指南来展示如何解决这个问题,尽管它是材料设计指南的一部分等等。
无论如何,这是我是如何做到的...

样式

我的styles.xml文件包含一个基础主题和我的主应用程序主题。我为使用导航抽屉的活动创建了另一个主题,如下所示:

<style name="Base.AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>

<style name="AppTheme" parent="Base.AppTheme">
    <item name="colorPrimary">@color/theme_primary</item>
    <item name="colorPrimaryDark">@color/theme_primary_dark</item>
    <item name="colorAccent">@color/theme_accent</item>
</style>

<style name="AppTheme.NavDrawer">
    <item name="android:windowBackground">@color/window_background</item>
</style>

颜色window_background是参考我的colors.xml文件,其中将其列为#FFF5F5F5。请注意,对于API 21+,上述工作方式略有不同,因此在values-v21目录中,创建另一个styles.xml。这个应该包括以下内容:
<style name="AppTheme.NavDrawer">
    <item name="android:windowBackground">@color/window_background</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

布局

现在来谈谈布局。在包含导航抽屉的布局文件中,您可以包含以下内容。

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" >

    <!-- The main content view -->
    <RelativeLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <android.support.design.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/main_adView">

            <!-- The app bar -->
            <android.support.design.widget.AppBarLayout
                android:fitsSystemWindows="true"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
                <android.support.v7.widget.Toolbar
                    android:id="@+id/main_toolbar"
                    style="@style/AppTheme.Toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:layout_scrollFlags="scroll|enterAlways"/>
            </android.support.design.widget.AppBarLayout>

            <!-- Your layout content below -->
            <FrameLayout
                android:id="@+id/your_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />
        </android.support.design.widget.CoordinatorLayout>

        <!-- Other stuff here if you like -->

    </RelativeLayout>

    <!-- The navigation drawer -->
    <include layout="@layout/navdrawer"
        android:id="@+id/main_navigationView" />

显然,如果您不需要其中的任何其他视图,则可以删除RelativeLayout,因为它是多余的。我在我的<include>标签中引用的导航抽屉如下:
<android.support.design.widget.NavigationView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="@dimen/navdrawer_width"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/navdrawer_header"
    app:menu="@menu/navdrawer_items" />

使用上述代码,您应该可以正确地在状态栏后面绘制导航抽屉。

很不幸,我也遇到了同样的问题。 我想知道这是一个样式问题还是布局问题...当我使用颜色来设置_android:colorPrimary_和_android:colorPrimaryDark_时,一切都很完美。 - Pier
@Pier,我认为如果您的最低API级别设置低于21,则应使用colorPrimary(以兼容旧设备),但是如果您只是为API 21+制作应用程序,则可以使用android:colorPrimary。老实说,我认为整个问题都可以通过样式和布局的更改来解决。 - Farbod Salamat-Zadeh
我有在values文件夹下的styles.xml中的colorPrimary和在values-v21下的styles.xml中的android:colorPrimaryDark。 - Pier
应该没问题 - 我认为颜色值不会有影响。特别是要看基础主题和导航主题,以及布局文件中使用的 Android 标签。 - Farbod Salamat-Zadeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接