半透明状态栏使布局越界(显示后面的视图)

Posted

技术标签:

【中文标题】半透明状态栏使布局越界(显示后面的视图)【英文标题】:Translucent Status bar makes the layout out of bounds(showing view behind) 【发布时间】:2018-08-22 09:07:27 【问题描述】:

我想实现一个半透明的状态栏,我找到了这个,

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

是的,当我的折叠工具栏/应用栏展开时,它使我的状态栏变成半透明

但问题是其中一个视图(imageView)落后于其他视图之一(似乎它的父布局超出了范围,请参阅附加图片)

opaque status bar, please see the image at the bottom

在此之前,我完全没有这样的问题

non-translucent status bar

这是我的xml,我尽量删除,请多包涵,

<?xml version="1.0" encoding="utf-8"?>
<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_
android:layout_
android:background="@android:color/background_light">

<android.support.design.widget.AppBarLayout
    android:id="@+id/mHomeAppBar"
    android:layout_
    android:layout_
    android:background="@color/colorPrimaryDark"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/main.collapsing"
        android:layout_
        android:layout_
        app:contentScrim="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|snap|exitUntilCollapsed"
        app:title="">

        <android.support.constraint.ConstraintLayout
            android:layout_
            android:layout_
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:paddingTop="15dp"
            app:layout_collapseMode="parallax"
            app:layout_scrollFlags="scroll|enterAlwaysCollapsed">

            <ImageView
                android:id="@+id/image_view_on_bottom"
                android:layout_
                android:layout_
                android:layout_marginBottom="10dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:srcCompat="@drawable/ic_near_me_white_18dp"/>

        </android.support.constraint.ConstraintLayout>

        <android.support.v7.widget.Toolbar
            android:id="@+id/mHomeToolbar"
            android:layout_
            android:layout_
            app:layout_collapseMode="pin"
            app:navigationIcon="?attr/homeAsUpIndicator"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

    </android.support.design.widget.CollapsingToolbarLayout>

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

<android.support.v4.widget.NestedScrollView
    android:id="@+id/mHomeScrollView"
    android:fitsSystemWindows="true"
    android:layout_
    android:layout_
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.constraint.ConstraintLayout
        android:layout_
        android:layout_>

        <LinearLayout
            android:id="@+id/mLayoutTabComponents"
            android:layout_
            android:layout_
            android:orientation="vertical"
            android:visibility="visible">

            <android.support.design.widget.TabLayout
                android:id="@+id/mHomeTabLayout"
                android:layout_
                android:layout_
                app:tabGravity="fill"
                app:tabMode="fixed" />

            <android.support.v4.view.ViewPager
                android:id="@+id/mHomeViewPager"
                android:layout_
                android:layout_
                android:layout_weight="1"

                app:layout_behavior="@string/appbar_scrolling_view_behavior" />
        </LinearLayout>


    </android.support.constraint.ConstraintLayout>

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

 </android.support.design.widget.CoordinatorLayout>

这就是风格

<style name = "AppThemeNoActionBar" parent = 
"Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimaryDark</item>
    <item name="android:subtitle">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <item name="android:background">@null</item>
    <!-- Support library compatibility -->
    <item name="background">@null</item>
</style>

我正在尝试一切,我尝试将 app:layout_behavior="@string/appbar_scrolling_view_behavior" 放在每个父容器和布局中,我尝试将 TabLayout 的 tabGravity 从填充中删除,但仍然没有运气:(,可以任何人都帮我找出问题所在,我知道我在样式上遗漏了一些东西,但请让我朝着正确的方向前进,再次,如果 xml 代码有点长,我深表歉意,提前谢谢!

更新:我删除了布局 xml 上所有不必要的视图内容。任何人? :(

【问题讨论】:

【参考方案1】:

我设法通过设置解决了我的问题

fitSystemWindows 

假的

这导致状态栏删除了它生成的填充,然后我在下一个布局上添加了一个 25dp 的顶部填充,这是包含所有子视图的 AppBarLayout,现在它可以完美地按照我的意愿工作。

感谢这些帖子,如果大家遇到相同或相关的半透明状态栏问题,请看这里

Translucent/Transparent status bar + CoordinatorLayout + Toolbar + Fragment

Using windowTranslucentStatus with CollapsingToolbarLayout

【讨论】:

以上是关于半透明状态栏使布局越界(显示后面的视图)的主要内容,如果未能解决你的问题,请参考以下文章

android将工具栏扩展到半透明状态栏,同时将其他布局对象保留在系统视图中

iPhone - 应用程序上方的半透明黑色状态栏

半透明/透明状态栏 + CoordinatorLayout + Toolbar + Fragment

获取正确大小的 android 状态栏并将其应用于 HTML?

swift 4.2 ios 12中的状态栏模糊视图(半透明)

创建一个像 UINavigationBar 这样的半透明视图