Android透明状态栏与反色图标

6
我在思考如何实现谷歌日历的外观。enter image description here 也就是说:
  • 倒置的状态栏图标
  • 自定义状态栏颜色(而不是通过windowTranslucentStatus设置的默认颜色透明度)
  • 调整小部件的上边距以使其位于状态栏下方
我尝试过: 将windowTranslucentStatus设置为True会禁用windowLightStatusBar:
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowTranslucentStatus">true</item>

仅允许完全透明(没有中间颜色),fitSystemWindows无法正常工作:

<item name="android:windowLightStatusBar">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">#19000000</item>

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

谢谢。
5个回答

8
成功找到解决方案:
onCreate(Kotlin中的):
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.statusBarColor = Color.parseColor("#1A000000")

styles.xml:

<item name="android:windowDrawsSystemBarBackgrounds">true</item>

你在哪里找到可以设置在每个XML属性内的值的文档? - Richard

4
通过编程设置所有标志解决了这个问题。显然,由于某种奇怪的原因,在样式中设置windowsLightStatusBar并没有反映出来。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.colorAccentDark));
        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
        //setStatusBarTranslucent(true);
    }

2

是的,您可以将状态栏图标颜色更改为黑色。请在您的values-v23/styles.xml文件中添加以下内容:

<item name="android:windowLightStatusBar">true</item>

例如,将以下内容添加到您的values-v23文件夹中的style.xml中:

<?xml version="1.0" encoding="utf-8"?>

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">#F5F5F5</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowLightStatusBar">true</item>
</style>

请确保在v23/styles.xml中将colorPrimaryDark更改为灰色或白色。它适用于API 23及以上的版本。


1
仅设置该选项并不能产生图片中的结果。 - Andre Romano

2
你可以尝试这个方法。在 values-v23 中添加以下内容,并将此主题设置为你的布局。
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:statusBarColor">#fff</item>
        <item name="android:windowLightStatusBar">true</item>
    </style>

这将把状态栏背景改为白色

<item name="android:statusBarColor">#fff</item>

这将会把状态栏图标变为反转色(灰色)。
<item name="android:windowLightStatusBar">true</item>

输出结果将会如下,你可以将你的操作栏颜色更改为任何你想要的,我已经将其设置为蓝色 在这里输入图片描述


0

在Compose中:

implementation "com.google.accompanist:accompanist-systemuicontroller:0.30.1"

val systemUiController = rememberSystemUiController()

SideEffect {
        systemUiController.setStatusBarColor(Color.Transparent, darkIcons = true)
        systemUiController.setNavigationBarColor(navigationBarColor)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接