如何根据状态栏主题切换通知状态栏图标的深浅颜色
实现通知状态栏图标颜色随状态栏深浅自动切换
嘿,这个需求我太熟了!之前做项目的时候正好踩过相关的坑,核心思路就是根据当前状态栏的明暗状态,动态给通知图标设置对应的 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
相关产品推荐
相关产品推荐

