如何在自定义通知布局中应用基于设备壁纸的动态颜色而不对整个应用程序进行主题化?

问题描述 投票:0回答:1

我正在开发一个 Android 应用程序,我需要将动态颜色(Material You 主题)应用到自定义通知布局。但是,我不想为整个应用程序设置主题 - 只是通知 UI。

我尝试过的:

在自定义主题中设置 colorPrimary、colorSecondary 等。 使用 RemoteViews 自定义通知布局并以编程方式应用颜色。

问题:

尽管做出了这些努力,我仍无法将动态颜色专门应用于自定义通知,而不影响应用程序的全局主题或面临诸如无法解析符号“colorPrimary”之类的问题。

我需要一个解决方案,将 Material You 的动态颜色应用于通知,而不改变整个应用程序的主题。

有没有办法将 Material You 动态颜色仅应用于 Android 中的自定义通知布局?任何代码示例或详细指导将不胜感激。

android
1个回答
0
投票

使用调色板从设备壁纸中提取主色。

import android.app.WallpaperManager
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import androidx.palette.graphics.Palette

fun getWallpaperColor(context: Context): Int? {
    val wallpaperManager = WallpaperManager.getInstance(context)
    val wallpaperDrawable = wallpaperManager.drawable

    if (wallpaperDrawable is BitmapDrawable) {
        val bitmap: Bitmap = wallpaperDrawable.bitmap
        val palette = Palette.from(bitmap).generate()
        return palette.getDominantColor(0)  // Get the dominant color or use other palette swatches
    }
    return null  // Default color if extraction fails
}

使用 RemoteViews 将提取的颜色应用于自定义通知布局中的特定视图。

<!-- res/layout/custom_notification.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp">

    <TextView
        android:id="@+id/notification_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Notification Title"
        android:textSize="18sp"
        android:textColor="@color/default_text_color" />

    <TextView
        android:id="@+id/notification_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/notification_title"
        android:text="Notification message"
        android:textSize="14sp"
        android:textColor="@color/default_text_color" />
</RelativeLayout>

此方法仅根据壁纸更改通知布局的颜色,而应用程序主题的其余部分保持不变。

import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.NotificationCompat
import android.content.Context
import android.os.Build
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat

fun createCustomNotification(context: Context) {
    val color = getWallpaperColor(context) ?: Color.BLUE  // Default color if none is extracted

    // Create custom view for notification
    val customView = RemoteViews(context.packageName, R.layout.custom_notification)
    customView.setTextColor(R.id.notification_title, color)
    customView.setTextColor(R.id.notification_message, color)

    val notificationBuilder = NotificationCompat.Builder(context, "YOUR_CHANNEL_ID")
        .setSmallIcon(R.drawable.notification_icon)
        .setStyle(NotificationCompat.DecoratedCustomViewStyle())
        .setCustomContentView(customView)
        .setPriority(NotificationCompat.PRIORITY_HIGH)

    // Create notification channel for Android O and above
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = NotificationChannel(
            "YOUR_CHANNEL_ID",
            "Your Channel Name",
            NotificationManager.IMPORTANCE_HIGH
        )
        context.getSystemService(NotificationManager::class.java).createNotificationChannel(channel)
    }

    // Show notification
    val notificationManager = NotificationManagerCompat.from(context)
    notificationManager.notify(1, notificationBuilder.build())
}

© www.soinside.com 2019 - 2024. All rights reserved.