透明状态栏

时间:2018-05-14 08:22:54

标签: android

我正在尝试在我的应用上实现无缝透明状态栏,到目前为止这是我所取得的成就:

enter image description here

如您所见,a)状态栏实际上并不完全透明,b)工具栏已被切断。

这是我的xml布局:

<LinearLayout 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:gravity="center_horizontal"
    tools:context=".ui.profile.ProfileActivity"
    android:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/profile_appbar"
    android:background="@drawable/topbar_gradient"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.Dark">

    <android.support.v7.widget.Toolbar
        android:fitsSystemWindows="true"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize"
        app:layout_scrollFlags="scroll|enterAlways"
        android:background="@drawable/topbar_gradient"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android" />
</android.support.design.widget.AppBarLayout>

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    (...)
</android.support.v7.widget.CardView>

</LinearLayout>

样式-v21.xml:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">

    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="cardViewStyle">@style/CardView</item>
    <item name="coordinatorLayoutStyle">@style/Widget.Support.CoordinatorLayout</item>
    <item name="chipStyle">@style/ChipStyle</item>


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


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

    <item name="cardViewStyle">@style/CardView</item>

    <item name="coordinatorLayoutStyle">@style/Widget.Support.CoordinatorLayout</item>
    <item name="chipStyle">@style/ChipStyle</item>

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

</style>

我已经尝试过fitSystemWindows的所有组合,我真的不明白这是做什么的。

3 个答案:

答案 0 :(得分:1)

这是一种hacky方式..但可能会帮助你..

你可以做的是计算StatusBar的高度,并添加toolbar的填充顶部和StatusBar的高度

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        toolbar.setPadding(0,getStatusBarHeight(context),0,0);
}

获得StatusBar

的高度
public static int getStatusBarHeight(final Context context) {
    final Resources resources = context.getResources();
    final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0)
        return resources.getDimensionPixelSize(resourceId);
    else
        return (int) Math.ceil((VERSION.SDK_INT >= VERSION_CODES.M ? 24 : 25) * resources.getDisplayMetrics().density);
}

编辑:

您需要将ToolBar的高度设置为wrap_content

<android.support.v7.widget.Toolbar
    android:fitsSystemWindows="true"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"

    android:layout_height="wrap_content"
    android:minHeight="?android:attr/actionBarSize"

    app:layout_scrollFlags="scroll|enterAlways"
    android:background="@drawable/topbar_gradient"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android" />

OUT-PUT:

enter image description here

希望它会对你有所帮助。

快乐编码。

答案 1 :(得分:0)

尝试将此添加到您的Activity onCreate()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window w = getWindow(); 
        w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }

答案 2 :(得分:0)

从样式中删除android:fitsSystemWindows="true"Toolbar中的<item name="android:windowDrawsSystemBarBackgrounds">true</item>android:windowDrawsSystemBarBackgrounds会导致在状态栏下绘制内容。