我试图在Android 10中隐藏状态栏.我已经阅读了很多类似问题的答案,但它们不适用于我的设备.目标是将状态栏的空间用作应用程序视图的一部分:
下面描述的一些解决方案可以在emulator上使用,但不能在我的物理设备上使用(Redmi Note 10,API版本29).
如果您有任何建议,我将不胜感激.
What I have tried:
- 使用不同的预定义样式,如
@android:style/Theme.NoTitleBar.Fullscreen
等. - 使用不同的样式属性,包括:
android:windowFullscreen
、fitsSystemWindows
等. - 使用setSystemUiVisibility设置程序代码中的不同样式,包括
SYSTEM_UI_FLAG_FULLSCREEN
、SYSTEM_UI_FLAG_IMMERSIVE_STICKY
、SYSTEM_UI_FLAG_HIDE_NAVIGATION
、SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
、SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
、SYSTEM_UI_FLAG_LAYOUT_STABLE
. - 使用clearFlags、addFlags和setFlags添加和删除不同的标志.
- 使用setStatusBarColor将状态栏 colored颜色 设置为透明.
- 使用requestWindowFeature请求不同的功能.
- 将布局顶部填充更改为负值.
- 通过定义applyTopWindowInsetsForView和onApplyWindowInsets个函数使用插入.
What I've managed to do.
我成功地得到了两个结果,但这两个结果对我都不好.
- 半透明状态栏.
- 完全黑色的状态栏,不占用应用程序视图的空间.
UPDATE 10 May 2022:
根据以下答案,不可能在API 29或更早版本上使用WindowInsetsController
:How do I hide the status bar in my Android 11 app?
SOLUTION 1
由@Zain人提议.
活动:
protected void onCreate(Bundle savedInstanceState) {
...
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
WindowInsetsControllerCompat windowInsetsCompat = new WindowInsetsControllerCompat(getWindow(), getWindow().getDecorView());
windowInsetsCompat.hide(WindowInsetsCompat.Type.statusBars());
windowInsetsCompat.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
...
主题xml:
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
SOLUTION 2
活动:
protected void onCreate(Bundle savedInstanceState) {
...
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LOW_PROFILE
);
...
主题xml:
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>