我试图在Android 10中隐藏状态栏。我已经读过很多类似问题的答案,但它们对我的设备不起作用。目标是使用状态栏的空间作为应用程序视图的一部分:
下面描述的一些解决方案可以在模拟器上工作,但不适用于我的物理设备(Redmi 10,API版本29)。
如有任何建议,我将不胜感激。
我试过的是:
@android:style/Theme.NoTitleBar.Fullscreen
等。android:windowFullscreen
、fitsSystemWindows
等。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
。我所做的。
我得到了两个结果,但这两个结果对我都没有好处。
2022年5月10日更新:
根据以下答案,在API 29或更早版本上使用WindowInsetsController
是不可能的:如何在我的Android 11应用程序中隐藏状态栏?
解决方案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);
...
theme.xml:
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
解决方案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
);
...
theme.xml:
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
发布于 2022-05-09 19:16:43
您需要在应用程序中显示内容(文件参考资料) )。
步骤1:使用:WindowCompat.setDecorFitsSystemWindows(window, false)
这是确保您的应用程序沿边到边的第一步,也就是说,使用显示的整个宽度和高度进行布局。使用WindowCompat.setDecorFitsSystemWindows(window,false)将应用程序布局到系统栏后面,如下面的代码示例所示:
步骤2:使用WindowInsetsControllerCompat
隐藏状态栏
WindowInsetsControllerCompat(window, window.decorView).apply {
// Hide the status bar
hide(WindowInsetsCompat.Type.statusBars())
// Allow showing the status bar with swiping from top to bottom
systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
步骤3:从步骤1开始,底部的活动内容将被底部的导航条模糊;然后需要使用WindowInsetsListener
将活动的根布局的底部边缘调整为导航栏的高度。
科特林:
// root layout of your activity
val root = findViewById<ConstraintLayout>(R.id.root)
ViewCompat.setOnApplyWindowInsetsListener(
root
) { view: View, windowInsets: WindowInsetsCompat ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
view.layoutParams = (view.layoutParams as FrameLayout.LayoutParams).apply {
// draw on top of the bottom navigation bar
bottomMargin = insets.bottom
}
// Return CONSUMED if you don't want the window insets to keep being
// passed down to descendant views.
WindowInsetsCompat.CONSUMED
}
爪哇:
WindowInsetsControllerCompat windowInsetsCompat = new WindowInsetsControllerCompat(getWindow(), getWindow().getDecorView());
windowInsetsCompat.hide(WindowInsetsCompat.Type.statusBars());
windowInsetsCompat.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
// root layout of your activity
ConstraintLayout root = findViewById(R.id.root);
ViewCompat.setOnApplyWindowInsetsListener(
root
, (view, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();
params.bottomMargin = insets.bottom;
return WindowInsetsCompat.CONSUMED;
});
步骤4:最终确保在应用程序的主题中允许在裁剪区域进行绘图:
<item name="android:windowLayoutInDisplayCutoutMode">always</item>
发布于 2022-05-10 12:11:03
我找到了解决办法。以下一行是必要的:
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
https://stackoverflow.com/questions/72179274
复制相似问题