在 android 中显示我的工具栏图像作为状态栏影响导航栏的背景

displaying my toolbar image as background to status bar effecting navigation bar in android

我希望我的工具栏使用状态栏的 space 和用于它的图像作为状态栏的背景,我使用 activity [=] 中的这段代码成功地做到了这一点13=]

    //    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);
    }

问题是这段代码使我的 activity 布局全屏显示,甚至 space 带有导航栏,所以如何解决这个问题?

这是屏幕图像

方法一

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

styles.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 不起作用,您可以试试这个

方法二

styles.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

希望对您有所帮助!

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

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);
}

调用这个方法。

这是我在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 的文档,基本上告诉你需要做什么。

The color for the status bar. If the color is not opaque, consider setting {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}. For this to take effect, the window must be drawing the system bar backgrounds with {@link android.R.attr#windowDrawsSystemBarBackgrounds} and the status bar must not have been requested to be translucent with {@link android.R.attr#windowTranslucentStatus}. Corresponds to {@link android.view.Window#setStatusBarColor(int)}.

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

现在在activity创建这个方法如下所示:

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,因为它会隐藏您要求显示的导航栏。

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

所以试试这个,如果它对你有用,请告诉我。

编辑:如果您在 activity 中有 FLAG_LAYOUT_NO_LIMITS 标志,请不要忘记删除它们,因为它会产生问题。这是我测试 android 10.

的结果