我有一些活动,可以在屏幕顶部附近的图片上覆盖Android状态栏。
我是通过继承Theme.AppCompat.DayNight.NoActionBar
的活动风格,然后在onCreate()
中做到这一点来实现的:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
这将在顶部实现透明的状态栏,这很好。
问题是,这也使底部的Android导航栏透明,并覆盖了活动底部附近的控件,这不是我想要的。我希望导航栏是不透明的,并占用其垂直空间而不要移开我的控件,就像在普通活动中不会溢出状态栏一样。
是否可以从状态栏中单独控制导航栏 的透明度和重叠程度,而无需任何人工的边距或填充?
答案 0 :(得分:0)
如果我理解正确,那么您的意图是获得透明的状态栏,而无需触摸下面的屏幕截图所示的导航栏。
我个人还尝试使用参数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>