You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 7.0无法设置状态栏为半透明黑色问题求助

Android 7.0 状态栏半透明显示灰色问题解决(CollapsingToolbarLayout场景)

我来帮你梳理下这个问题的核心原因和解决办法,你遇到的情况在使用CollapsingToolbarLayout时很常见,主要是主题配置冲突专属属性未设置布局flag使用不当这几个点导致的:

核心问题分析

  1. 主题与代码的flag冲突:你在主题里设置了android:windowTranslucentStatus="true",这个属性会自动给Window添加FLAG_TRANSLUCENT_STATUS,而当这个flag存在时,setStatusBarColor()会被系统忽略,状态栏会显示默认的半透明灰色。
  2. CollapsingToolbarLayout专属属性缺失:你没有设置app:statusBarScrim,这个属性是用来控制折叠状态下状态栏遮罩颜色的,默认值就是灰色,所以折叠时会出现你看到的问题。
  3. 布局flag清理错误:你在代码里清除了FLAG_LAYOUT_NO_LIMITS,这个flag是让布局内容延伸到状态栏后面的必要设置,去掉它会导致状态栏无法和布局融合。

分步解决办法

1. 调整主题配置

移除主题中干扰状态栏颜色设置的属性,修改AppTheme.NoActionBar

<style name="AppTheme.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">false</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowActionBarOverlay">true</item>
    <!-- 移除这一行,避免和代码设置冲突 -->
    <!-- <item name="android:windowTranslucentStatus">true</item> -->
    <item name="android:windowTranslucentNavigation">true</item>
</style>

2. 给CollapsingToolbarLayout添加状态栏遮罩属性

在你的CollapsingToolbarLayout标签中添加app:statusBarScrim,指定半透明黑色:

<android.support.design.widget.CollapsingToolbarLayout 
    android:id="@+id/collapse_toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_scrollFlags="scroll|exitUntilCollapsed" 
    android:fitsSystemWindows="true" 
    app:contentScrim="#b2000000" 
    app:expandedTitleMarginStart="48dp" 
    app:expandedTitleMarginEnd="64dp"
    <!-- 设置折叠时状态栏的半透明遮罩 -->
    app:statusBarScrim="#b2000000">

3. 修正Java代码中的Window设置

保留FLAG_LAYOUT_NO_LIMITS,只清除干扰的FLAG_TRANSLUCENT_STATUS

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    // 仅清除FLAG_TRANSLUCENT_STATUS,保留布局延伸到状态栏的flag
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    // 设置半透明黑色状态栏
    window.setStatusBarColor(getResources().getColor(R.color.translucent_black2));
}

4. 优化布局的fitsSystemWindows属性

移除ImageView(parallaxImage)的android:fitsSystemWindows="true",因为CollapsingToolbarLayout已经处理了系统窗口边距,多层级设置会导致边距叠加异常:

<ImageView 
    android:id="@+id/parallaxImage" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scaleType="centerCrop" 
    <!-- 移除这一行 -->
    <!-- android:fitsSystemWindows="true" -->
    app:layout_collapseMode="parallax" 
    app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />

验证效果

做完这些修改后,你会发现:

  • 展开状态下,状态栏会显示你设置的半透明黑色,和布局背景融合;
  • 折叠状态下,statusBarScrim会生效,状态栏保持半透明黑色,不会变回灰色;
  • 纯色状态栏设置依然正常工作。

内容的提问来源于stack exchange,提问作者Rektirino

火山引擎 最新活动