工具栏重叠在状态栏下方

Toolbar overlapping below status bar

我想在我的 activity 中安装 appcompat v21 工具栏。但我正在实施的工具栏在状态栏下方重叠。我该如何解决?

这是 activity 布局 xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

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

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
</LinearLayout>

工具栏视图:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary" />

主题风格:

<style name="AppTheme" parent="MaterialNavigationDrawerTheme.Light.DarkActionBar">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
</style>

在布局的根视图中使用 android:fitsSystemWindows="true"(在您的情况下为 LinearLayout)。 android:fitsSystemWindows 是一个

internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.

Must be a boolean value, either "true" or "false".

This may also be a reference to a resource (in the form "@[package:]type:name") or theme attribute (in the form "?[package:][type:]name") containing a value of this type.

This corresponds to the global attribute resource symbol fitsSystemWindows.

对我来说,问题是我从示例中复制了一些东西并使用了

<item name="android:windowTranslucentStatus">true</item>

只需删除它即可解决我的问题。

只需将此设置为 v21/styles.xml 文件

 <item name="android:windowDrawsSystemBarBackgrounds">true</item>
 <item name="android:statusBarColor">@color/colorPrimaryDark</item>

并确保

 <item name="android:windowTranslucentStatus">false</item>

我从 /res/values-v21/styles.xml 中删除了下面提到的所有行,现在它工作正常。

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


 <item name="windowActionBar">false</item>
 <item name="android:windowDisablePreview">true</item>

 <item name="windowNoTitle">true</item>

 <item name="android:fitsSystemWindows">true</item>

None 的答案对我有用,但这是我在根视图上设置 android:fitSystemWindows 后最终起作用的(我在样式 v21 中设置这些):

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowTranslucentStatus">false</item>

确保你没有默认情况下有以下行:

<item name="android:statusBarColor">@android:color/transparent</item>

None 的答案对我有用,但这是我设置后最终起作用的答案:

android:fitsSystemWindows="false"

在父级 activity 布局文件中,很多地方都不建议这样做,但它对我有用并且节省了我的时间

根据 google 文档,我们不应该在应用程序主题中使用 fitsSystemWindows 属性,它应该在布局文件中使用。在主题中使用可能会导致 toast 消息出现问题。

检查问题here & example of problem caused here

<item name="android:fitsSystemWindows">true</item>

使用正确方法的示例,它也适用于 windowTranslucentStatus

<?xml version="1.0" encoding="utf-8"?>
<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:fitsSystemWindows="true"

android:layout_width="match_parent"
android:layout_height="match_parent"
> 


<include layout="@layout/toolbar"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
</include>

<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"
    android:background="@color/white"
    android:animateLayoutChanges="true"
    app:headerLayout="@layout/navigation_drawer_header"
    app:menu="@menu/navigation_drawer_menu" />

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

从 style 或 style(21) 中删除以下行

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:windowTranslucentStatus">false</item>

发生这种情况的原因有很多..首先你必须检查他们是怎么回事..

<style name="AppTheme" parent="BaseAppTheme">
        <item name="android:windowBackground">@android:color/white</item>
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primary_dark</item>
        <item name="colorAccent">@color/accent</item>
        <item name="android:textColorHint">@color/secondary_text</item>
    </style>

如果您在主题中使用 <item name="android:windowTranslucentStatus">true</item> 此代码,它应该与您的操作栏重叠。你可以使用它 false 来解决这个问题。
<item name="android:windowTranslucentStatus">false</item>.

或者如果您想保持真实,请使用

<item name="android:fitsSystemWindows">true</item> 为真。您还有另一种选择来使用它。你可以使用 android:fitsSystemWindows="true"

这在特定 xml 文件的根视图中。

要防止工具栏与状态栏重叠,请在您的主题中添加这些行

<item name="android:windowTranslucentStatus">true</item>
<item name="android:fitsSystemWindow">true</item>

对我有用