4

我希望我的工具栏占用状态栏的空间,并将用于它的图像作为状态栏的背景,我在我的活动中使用此代码成功地做到了这一点

    //    for using status bar space
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }

问题是这段代码使我的活动布局占据了全屏甚至带有导航栏的空间那么如何解决这个问题?

这是屏幕的图像 在此处输入图像描述

4

3 回答 3

5

这是我用于在 android 10 和其他版本上进行测试的解决方案,因此请检查这是否有帮助。

在您styles.xml创建自定义主题时,您可以将父主题设置为您的应用程序主题,如果它有任何 NoActionBar(AppCompat/DayNight/material 等)设置为父级或直接设置一个(因为没有 NoActionBar,默认的将获得在顶部生成),主要要求是这三行:

<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:statusBarColor">#00000000</item>
</style>

如果您愿意,可以查看 statusBarColor 的文档,基本上会告诉您需要做什么。

状态栏的颜色。如果颜色不透明,请考虑设置 {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_STABLE} 和 {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}。要使其生效,窗口必须使用 {@link android.R.attr#windowDrawsSystemBarBackgrounds} 绘制系统栏背景,并且不得使用 {@link android.R.attr#windowTranslucentStatus 请求状态栏为半透明}。对应于 {@link android.view.Window#setStatusBarColor(int)}。

因此,只需根据您的要求设置透明颜色或您希望设置为状态栏的任何颜色。并将此主题设置为您想要的活动。

现在在活动中创建这个方法,如下所示:

private void showCustomUI() {
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }

这些是您需要的标志,在设置标志时不要添加 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,因为它隐藏了您需要显示的导航栏。

您需要调用该方法,否则将无法正确创建状态栏。

所以试试这个,让我知道它是否对你有用。

编辑:不要忘记删除FLAG_LAYOUT_NO_LIMITS标志以防它们处于活动状态,因为它会产生问题。这是我对 android 10 进行的测试。

在此处输入图像描述

于 2020-02-12T17:49:04.913 回答
2

方法一

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

样式.xml

<style name="TranslucentStatusBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
</style>

v21\styles.xml

<style name="TranslucentStatusBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">false</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

状态栏将透明或半透明,导航栏不会

如果设置windowTranslucentStatus不起作用true,你可以试试这个

方法二

样式.xml;只需更改父级而不添加windowTranslucentStatus

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

覆盖 v21 和 v23 的样式

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>

并将其添加到您的activity.class

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

来自answer1 , answer2的参考

希望这可以帮助!

于 2020-02-11T07:29:17.057 回答
1

通过使用这些标志,您可以实现这一目标。

private void showSystemUI() {

    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

调用这个方法。

于 2020-02-11T10:25:14.537 回答