You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据状态栏主题切换通知状态栏图标的深浅颜色

实现通知状态栏图标颜色随状态栏深浅自动切换

嘿,这个需求我太熟了!之前做项目的时候正好踩过相关的坑,核心思路就是根据当前状态栏的明暗状态,动态给通知图标设置对应的 tint 颜色,下面分步骤给你讲清楚具体实现:

1. 准备基础资源

首先得准备一套通用的通知图标(建议用透明背景的矢量图,避免出现多余色块),然后在颜色资源里定义两种状态的图标颜色:

  • 在res/values/colors.xml(适配浅色状态栏/主题):
    <color name="notification_icon_dark">#888888</color> <!-- 灰色,浅色状态栏下显示 -->
    
  • 在res/values-night/colors.xml(适配深色状态栏/主题):
    <color name="notification_icon_light">#FFFFFF</color> <!-- 白色,深色状态栏下显示 -->
    

2. 准确判断状态栏的明暗状态

光靠系统的深色模式判断还不够——有些应用会单独设置状态栏为浅色(比如设置windowLightStatusBar=true),这时候即使系统是深色模式,状态栏也是浅色的。所以我们需要写一个方法直接判断当前状态栏的明暗:

fun isStatusBarLight(context: Context): Boolean {
    if (context !is Activity) return false
    val window = context.window
    val uiFlags = window.decorView.systemUiVisibility
    return uiFlags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR != 0
}

这个方法返回true时,说明状态栏是浅色(需要显示深色图标);返回false时,状态栏是深色(需要显示浅色图标)。

3. 动态设置通知图标颜色

接下来创建通知时,根据上面的判断结果给图标设置对应的 tint 颜色:

// 1. 获取当前状态栏的明暗状态
val isLightStatusBar = isStatusBarLight(context)

// 2. 选择对应的图标 tint 颜色
val tintColor = if (isLightStatusBar) {
    ContextCompat.getColor(context, R.color.notification_icon_dark)
} else {
    ContextCompat.getColor(context, R.color.notification_icon_light)
}

// 3. 给通知图标设置 tint
val notificationIcon = ContextCompat.getDrawable(context, R.drawable.ic_notification)?.mutate()
notificationIcon?.let {
    DrawableCompat.setTint(it, tintColor)
}

// 4. 构建并发送通知
val notificationBuilder = NotificationCompat.Builder(context, YOUR_CHANNEL_ID)
    .setSmallIcon(Icon.createWithDrawable(notificationIcon!!))
    .setContentTitle("示例通知")
    .setContentText("这是一个适配状态栏颜色的通知")
    .setPriority(NotificationCompat.PRIORITY_DEFAULT)

val notificationManager = ContextCompat.getSystemService(context, NotificationManager::class.java) as NotificationManager
notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build())

4. 适配Android 8.0+的通知渠道

如果你的应用需要适配Android O(API 26)及以上版本,别忘了先创建通知渠道(渠道的默认颜色会被上面的动态 tint 覆盖,不用怕冲突):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val channel = NotificationChannel(
        YOUR_CHANNEL_ID,
        "常规通知",
        NotificationManager.IMPORTANCE_DEFAULT
    ).apply {
        description = "用于显示普通通知内容"
    }
    val notificationManager = context.getSystemService(NotificationManager::class.java)
    notificationManager.createNotificationChannel(channel)
}

额外提示

  • 如果你用Java开发,语法稍作调整即可,核心逻辑完全一致。
  • 尽量用NotificationCompat库构建通知,它会自动帮你兼容低版本系统。
  • 图标一定要用透明背景的矢量图,不然 tint 后会出现奇怪的色块。

内容的提问来源于stack exchange,提问作者Skosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:55:49