是否可以在活动上覆盖状态栏,但不能覆盖导航栏

时间:2020-10-09 08:37:46

标签: android overlay fullscreen statusbar navigationbar

我有一些活动,可以在屏幕顶部附近的图片上覆盖Android状态栏。 我是通过继承Theme.AppCompat.DayNight.NoActionBar的活动风格,然后在onCreate()中做到这一点来实现的:

            getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
                                 WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

这将在顶部实现透明的状态栏,这很好。

问题是,这也使底部的Android导航栏透明,并覆盖了活动底部附近的控件,这不是我想要的。我希望导航栏是不透明的,并占用其垂直空间而不要移开我的控件,就像在普通活动中不会溢出状态栏一样。

是否可以从状态栏中单独控制导航栏 的透明度和重叠程度,而无需任何人工的边距或填充?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您的意图是获得透明的状态栏,而无需触摸下面的屏幕截图所示的导航栏。

enter image description here

我个人还尝试使用参数FLAG_LAYOUT_NO_LIMITS而不达到期望的结果。问题是我同时获得状态栏和导航栏,这些状态栏和导航栏被图形“覆盖”为按钮。临时的解决方案是检测导航栏,并以编程方式向图形添加填充。这是部分无用的,因为许多Android用户使用adb shell overscan命令来隐藏导航栏。该命令的主要问题在于,它有效地隐藏了导航栏,但将系统欺骗为表示该栏是否存在的布尔值,而布尔值没有改变。该API已在Android 11中完全删除。

可以通过使用样式来实现所需的效果。 将这些属性添加到您的活动样式中:

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

您将获得如下样式:

<style name="ExampleThemeStackOverFlow" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="colorPrimary">@color/colorAccentX</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:navigationBarColor">@color/colorPrimary</item>
    <item name="android:windowLightNavigationBar" tools:targetApi="27">true</item>

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