我正在开发一个 Android 应用程序,我需要将动态颜色(Material You 主题)应用到自定义通知布局。但是,我不想为整个应用程序设置主题 - 只是通知 UI。
我尝试过的:
在自定义主题中设置 colorPrimary、colorSecondary 等。 使用 RemoteViews 自定义通知布局并以编程方式应用颜色。
问题:
尽管做出了这些努力,我仍无法将动态颜色专门应用于自定义通知,而不影响应用程序的全局主题或面临诸如无法解析符号“colorPrimary”之类的问题。
我需要一个解决方案,将 Material You 的动态颜色应用于通知,而不改变整个应用程序的主题。
有没有办法将 Material You 动态颜色仅应用于 Android 中的自定义通知布局?任何代码示例或详细指导将不胜感激。
使用调色板从设备壁纸中提取主色。
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())
}