首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Android 10 (API 29)中隐藏状态栏,并在应用程序中使用它的空间

在Android 10 (API 29)中隐藏状态栏,并在应用程序中使用它的空间
EN

Stack Overflow用户
提问于 2022-05-09 15:45:29
回答 2查看 2.2K关注 0票数 5

我试图在Android 10中隐藏状态栏。我已经读过很多类似问题的答案,但它们对我的设备不起作用。目标是使用状态栏的空间作为应用程序视图的一部分:

下面描述的一些解决方案可以在模拟器上工作,但不适用于我的物理设备(Redmi 10,API版本29)。

如有任何建议,我将不胜感激。

我试过的是:

  • 使用不同的预定义样式,如@android:style/Theme.NoTitleBar.Fullscreen等。
  • 使用不同的样式属性,包括:android:windowFullscreenfitsSystemWindows等。
  • 使用setSystemUiVisibility在程序代码中设置不同的样式,包括SYSTEM_UI_FLAG_FULLSCREENSYSTEM_UI_FLAG_IMMERSIVE_STICKYSYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_LAYOUT_FULLSCREENSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONSYSTEM_UI_FLAG_LAYOUT_STABLE
  • 使用clearFlagsaddFlagssetFlags添加和删除不同的标志。
  • 使用setStatusBarColor.将状态栏颜色设置为透明
  • 使用requestWindowFeature.请求不同的特性
  • 将布局顶部填充更改为负值。
  • 通过定义applyTopWindowInsetsForViewonApplyWindowInsets函数来使用内嵌。

我所做的。

我得到了两个结果,但这两个结果对我都没有好处。

  1. 半透明状态栏

  1. 完全黑色状态栏,不占用其空间为应用程序视图。

2022年5月10日更新:

根据以下答案,在API 29或更早版本上使用WindowInsetsController是不可能的:如何在我的Android 11应用程序中隐藏状态栏?

解决方案1

@Zain提出。

活动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>

解决方案2

活动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-09 19:16:43

您需要在应用程序中显示内容(文件参考资料) )。

步骤1:使用:WindowCompat.setDecorFitsSystemWindows(window, false)

这是确保您的应用程序沿边到边的第一步,也就是说,使用显示的整个宽度和高度进行布局。使用WindowCompat.setDecorFitsSystemWindows(window,false)将应用程序布局到系统栏后面,如下面的代码示例所示:

步骤2:使用WindowInsetsControllerCompat隐藏状态栏

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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将活动的根布局的底部边缘调整为导航栏的高度。

科特林:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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
}

爪哇:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:最终确保在应用程序的主题中允许在裁剪区域进行绘图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<item name="android:windowLayoutInDisplayCutoutMode">always</item>
票数 7
EN

Stack Overflow用户

发布于 2022-05-10 12:11:03

我找到了解决办法。以下一行是必要的:

<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72179274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文