如何在安卓系统中改变状态栏的颜色?

565

3
只有在KitKat之后才有可能实现。@MarkBuikema - codercat
9
如Niels所建议,从v21开始有一个名为 android:statusBarColor 的主题属性。你可以简单地将其添加到 values-v21/styles.xml 中。 - Levite
@MarkBuikema 这跟root访问权限有什么关系! - Steve Moretz
请查看此答案(使状态栏为白色,图标为黑色)。链接:https://dev59.com/gV4c5IYBdhLWcg3wuMJ7#74375368 - Rumit Patel
32个回答

2
此解决方案仅适用于API >= 23。 在API级别30中,setSystemUiVisibility()已被弃用。因此,您应该按以下方式使用WindowInsetsControllerCompat。
fun changeColorStatusBar(color: Int = R.color.white) {
        val window: Window = window
        val decorView = window.decorView
        val wic = WindowInsetsControllerCompat(window, decorView)
        wic.isAppearanceLightStatusBars = true
        // And then you can set any background color to the status bar.
        window.statusBarColor = ContextCompat.getColor(this, color)
    }

2

还有一个解决方案:

final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);

这个能在状态栏在屏幕底部的平板电脑上运行吗? - guy.gc
8
这里的"w"和"UiUtil"是什么? - Manav Patadia

2

2023 - 使用 windowInsetController


 fun Activity.setSystemBars(
    lightStatusBarColor: Int = Color.WHITE,
    darkStatusBarColor: Int = Color.BLACK,
    lightNavigationBarColor: Int = Color.WHITE,
    darkNavigationBarColor: Int = Color.BLACK,
) {

    when (resources.configuration.uiMode.and(Configuration.UI_MODE_NIGHT_MASK)) {
        Configuration.UI_MODE_NIGHT_YES -> {
            setSystemBarAppearance(
                statusBarColor = getColorFromId(darkStatusBarColor),
                navigationBarColor = getColorFromId(darkNavigationBarColor),
                isAppearanceLightNavigationBars = false,
                isAppearanceLightStatusBars = false
            )
        }
        Configuration.UI_MODE_NIGHT_NO -> {
            setSystemBarAppearance(
                statusBarColor = getColorFromId(lightStatusBarColor),
                navigationBarColor = getColorFromId(lightNavigationBarColor),
                isAppearanceLightNavigationBars = true,
                isAppearanceLightStatusBars = true
            )
        }
        Configuration.UI_MODE_NIGHT_UNDEFINED -> {
            setSystemBarAppearance()
        }
    }
}


fun Activity.setSystemBarAppearance(
    statusBarColor: Int = Color.WHITE,
    navigationBarColor: Int = Color.WHITE,
    isAppearanceLightStatusBars: Boolean = true,
    isAppearanceLightNavigationBars: Boolean = true
) {
        window.statusBarColor = statusBarColor
        window.navigationBarColor = navigationBarColor
        val windowInsetController = WindowCompat.getInsetsController(window, window.decorView)
        windowInsetController.isAppearanceLightStatusBars = isAppearanceLightStatusBars
        windowInsetController.isAppearanceLightNavigationBars = isAppearanceLightNavigationBars
}

fun Context.getColorFromId(id: Int) = ContextCompat.getColor(this, id)

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

1

一个非常古老的问题。但是对于想要根据主题 DarkLight 甚至 Device DEFAULTANDROID 5.0, API 21 及以上版本更改状态栏颜色的人。 在 super.onCreate(savedInstanceState); 之后并在 setContentView(R.layout.activity_main); 之前将此代码放入您的活动中。

int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
    switch (currentNightMode) {
        case Configuration.UI_MODE_NIGHT_NO:
            // Night mode is not active on device
            // For WHITE status bar Icons color to dark
            Window window = getWindow();
            View view = window.getDecorView();
            new WindowInsetsControllerCompat(window, view).setAppearanceLightStatusBars(true);
            break;
        case Configuration.UI_MODE_NIGHT_YES:
            // Night mode is active on device
            break;
    }

在您的 style.xml 文件中加入以下代码:<item name="android:statusBarColor">@color/colorWhite</item>

无法看到任何style.xml文件。 - Atys

1
如果您想设置自定义的可绘制文件,请使用以下代码片段。
fun setCustomStatusBar(){
    if (Build.VERSION.SDK_INT >= 21) {
        val decor = window.decorView
        decor.viewTreeObserver.addOnPreDrawListener(object :
            ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                decor.viewTreeObserver.removeOnPreDrawListener(this)
                val statusBar = decor.findViewById<View> 
                  (android.R.id.statusBarBackground)
                statusBar.setBackgroundResource(R.drawable.bg_statusbar)
                return true
            }
        })
    }
}

1
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <!-- Primary brand color. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorPrimaryVariant">@color/colorPrimaryDark</item>
    <item name="colorOnPrimary">@color/white</item>
    <!-- Secondary brand color. -->
    <item name="colorOnSecondary">@color/black</item>
    <!-- Status bar color. -->
    <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
    <!-- Customize your theme here. -->
</style>

通知:设置colorPrimaryVariant。

1

仅针对特定活动使用:

   Window window = this.getWindow();
   window.setStatusBarColor(this.getResources().getColor(R.color.red));

或者用 Kotlin

window.statusBarColor = ContextCompat.getColor(this, R.color.red)

在 Activity 的 onCreate 方法中。
对于整个应用程序,在 themes.xml 中更新 "colorPrimaryVariant" :
<style name="Theme.Demo" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/text_color</item>
        
        <!-- Primary brand color, used for status bar color   -->
        <item name="colorPrimaryVariant">@color/red</item>
  </style>

0
在 values/theme.xml 中添加名为 name="android:statusBarColor" 的项目。
 <resources xmlns:tools="http://schemas.android.com/tools">
        <style name="Theme.YourAppName" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
            ...
            ...
            ...
            <!-- Status bar color. -->
            <item name="android:statusBarColor" tools:targetApi="l">@color/purple_700</item>
        </style>
    </resources>

0
在 Kotlin 中,我能够使用以下方法解决这个问题:
  window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
  window.statusBarColor = ContextCompat.getColor(this, android.R.color.transparent)

0

从您想要更改状态栏颜色的活动中调用方法。

blackIconStatusBar(this, R.color.white);

方法定义

public static void blackIconStatusBar(Activity activity, int color) {

    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
    activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    activity.getWindow().setStatusBarColor(ContextCompat.getColor(activity, color));
}

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