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)
}
还有一个解决方案:
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);
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)
一个非常古老的问题。但是对于想要根据主题 Dark
和 Light
甚至 Device DEFAULT
在 ANDROID 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>
。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
}
})
}
}
<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>
仅针对特定活动使用:
Window window = this.getWindow();
window.setStatusBarColor(this.getResources().getColor(R.color.red));
或者用 Kotlin
window.statusBarColor = ContextCompat.getColor(this, R.color.red)
<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>
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>
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = ContextCompat.getColor(this, android.R.color.transparent)
从您想要更改状态栏颜色的活动中调用方法。
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));
}
android:statusBarColor
的主题属性。你可以简单地将其添加到values-v21/styles.xml
中。 - Levite