Xamarin Android:如何自定义标准推送通知布局?
自定义通知图标与布局解决方案
嘿,我来帮你搞定这个问题!既然你已经能通过重写BuildNotification方法修改通知文本,那自定义图标和布局的步骤其实很清晰,我分两部分给你拆解:
一、自定义铃铛图标
不管是状态栏的小图标,还是通知布局里的铃铛图标,都可以通过以下方式设置:
准备符合规范的图标
先把你的铃铛图标放到项目的drawable文件夹(如果是矢量图就放drawable-v24),注意通知小图标建议用白色透明背景的样式,这样在深色/浅色状态栏都能正常显示,尺寸建议是24x24dp(矢量图的话不用纠结尺寸)。在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
相关产品推荐
相关产品推荐

