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

Xamarin Android:如何自定义标准推送通知布局?

自定义通知图标与布局解决方案

嘿,我来帮你搞定这个问题!既然你已经能通过重写BuildNotification方法修改通知文本,那自定义图标和布局的步骤其实很清晰,我分两部分给你拆解:

一、自定义铃铛图标

不管是状态栏的小图标,还是通知布局里的铃铛图标,都可以通过以下方式设置:

  1. 准备符合规范的图标
    先把你的铃铛图标放到项目的drawable文件夹(如果是矢量图就放drawable-v24),注意通知小图标建议用白色透明背景的样式,这样在深色/浅色状态栏都能正常显示,尺寸建议是24x24dp(矢量图的话不用纠结尺寸)。

  2. 在BuildNotification中设置图标

    • 如果是状态栏的小图标,直接在NotificationCompat.Builder里调用SetSmallIcon()(C#)或setSmallIcon()(Java):
      builder.SetSmallIcon(Resource.Drawable.your_bell_icon);
      
      builder.setSmallIcon(R.drawable.your_bell_icon);
      
    • 如果是自定义布局里的铃铛图标,后面讲布局的时候会用RemoteViews来设置,当然你也可以直接在布局XML里写死资源ID。

二、自定义整体通知布局

要实现带铃铛图标、动态标题/正文、固定“BOOK OF LIFE”的布局,需要先创建自定义布局XML,再通过RemoteViews加载并绑定数据:

1. 创建自定义布局XML

在res/layout下新建notification_custom_layout.xml,示例布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="16dp">

    <!-- 铃铛图标 -->
    <ImageView
        android:id="@+id/notification_bell"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:src="@drawable/your_bell_icon"
        android:contentDescription="Notification bell"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginStart="12dp">

        <!-- 服务器传来的标题 -->
        <TextView
            android:id="@+id/notification_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:textStyle="bold"/>

        <!-- 服务器传来的正文 -->
        <TextView
            android:id="@+id/notification_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            android:textColor="@android:color/darker_gray"
            android:layout_marginTop="4dp"/>

        <!-- 应用固定文本:BOOK OF LIFE -->
        <TextView
            android:id="@+id/notification_app_tag"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="BOOK OF LIFE"
            android:textSize="12sp"
            android:textColor="@android:color/darker_gray"
            android:layout_marginTop="8dp"/>
    </LinearLayout>
</LinearLayout>

2. 在BuildNotification中加载并绑定数据

重写方法里,用RemoteViews加载自定义布局,然后把服务器传来的标题、正文设置到对应控件上,最后绑定到通知Builder:

C#示例(Xamarin Android):

public override Notification BuildNotification(string contentTitle, string contentText, Android.Graphics.Bitmap largeIcon, Intent intent)
{
    // 初始化自定义布局的RemoteViews
    var customNotificationView = new RemoteViews(Context.PackageName, Resource.Layout.notification_custom_layout);

    // 设置服务器传来的标题和正文
    customNotificationView.SetTextViewText(Resource.Id.notification_title, contentTitle);
    customNotificationView.SetTextViewText(Resource.Id.notification_content, contentText);

    // (可选)如果需要动态更换铃铛图标,用这句替换布局里的固定图标
    // customNotificationView.SetImageViewResource(Resource.Id.notification_bell, Resource.Drawable.your_bell_icon);

    // 创建通知Builder
    var builder = new NotificationCompat.Builder(Context, YOUR_NOTIFICATION_CHANNEL_ID)
        .SetSmallIcon(Resource.Drawable.your_bell_icon) // 状态栏小图标
        .SetContentIntent(PendingIntent.GetActivity(Context, 0, intent, PendingIntentFlags.UpdateCurrent))
        .SetAutoCancel(true);

    // 绑定自定义布局
    builder.SetCustomContentView(customNotificationView);
    // 如果需要展开后的大布局,可以创建另一个RemoteViews调用SetCustomBigContentView()

    return builder.Build();
}

Java示例:

@Override
public Notification buildNotification(String contentTitle, String contentText, Bitmap largeIcon, Intent intent) {
    // 加载自定义布局
    RemoteViews customView = new RemoteViews(getPackageName(), R.layout.notification_custom_layout);

    // 设置动态内容
    customView.setTextViewText(R.id.notification_title, contentTitle);
    customView.setTextViewText(R.id.notification_content, contentText);

    // (可选)动态设置铃铛图标
    // customView.setImageViewResource(R.id.notification_bell, R.drawable.your_bell_icon);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext(), YOUR_NOTIFICATION_CHANNEL_ID)
            .setSmallIcon(R.drawable.your_bell_icon)
            .setContentIntent(PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT))
            .setAutoCancel(true);

    // 绑定自定义布局
    builder.setCustomContentView(customView);

    return builder.build();
}

三、注意事项

  • 通知渠道适配:Android 8.0(API 26)及以上必须创建通知渠道,渠道的默认图标可以设置,但单个通知可以通过SetSmallIcon覆盖。
  • RemoteViews限制:只能使用系统自带的控件(TextView、ImageView等),不能用自定义View,否则会抛出异常。
  • 图标兼容性:如果是Android 5.0以下的设备,通知小图标会自动被渲染成白色,所以不用额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:06:39