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

如何获取代码生成的Drawable对象对应的int类型资源ID

解决方案:动态Drawable作为通知小图标

动态创建的Drawable对象没有对应的int类型资源ID——资源ID是编译时系统给res目录下静态资源分配的,代码实例化的Drawable不存在这个ID,因此无法直接转换成int传入setSmallIcon()。要实现自定义通知小图标,可根据目标API版本选择以下方案:

方案1:使用Icon API(Android 6.0/API 23及以上)

把自定义Drawable转成Bitmap,再通过Icon类创建实例,直接传入setSmallIcon()的重载方法:

// 将MyDrawable转换为Bitmap
MyDrawable mydrawing = new MyDrawable(myText);
// 确保Drawable有明确的尺寸,若没有可自行指定宽高
int width = mydrawing.getIntrinsicWidth() > 0 ? mydrawing.getIntrinsicWidth() : 48;
int height = mydrawing.getIntrinsicHeight() > 0 ? mydrawing.getIntrinsicHeight() : 48;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
mydrawing.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
mydrawing.draw(canvas);

// 创建Icon对象并设置
Icon customIcon = Icon.createWithBitmap(bitmap);
mBuilder = new NotificationCompat.Builder(context,"default")
        .setContent(mRemoteViews)
        .setOnlyAlertOnce(true)
        .setAutoCancel(false)
        .setOngoing(true)
        .setSmallIcon(customIcon);

方案2:自定义小图标布局(Android 8.0/API 26及以上)

利用setCustomSmallIcon()方法,传入包含自定义Drawable的RemoteViews:

  1. 先在res/layout下创建自定义小图标布局custom_notification_small_icon.xml:
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/small_icon_img"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="centerInside"/>
  1. 代码中设置RemoteViews并传入通知Builder:
RemoteViews smallIconRemoteViews = new RemoteViews(context.getPackageName(), R.layout.custom_notification_small_icon);
smallIconRemoteViews.setImageViewDrawable(R.id.small_icon_img, new MyDrawable(myText));

mBuilder = new NotificationCompat.Builder(context,"default")
        .setContent(mRemoteViews)
        .setOnlyAlertOnce(true)
        .setAutoCancel(false)
        .setOngoing(true)
        .setCustomSmallIcon(smallIconRemoteViews);

方案3:兼容低版本(Android 6.0以下)

低版本没有Icon或setCustomSmallIcon支持,可通过自定义整个通知布局+占位小图标实现:

  1. 确保自定义通知布局(即你的mRemoteViews对应的布局)中包含显示自定义图标的ImageView;
  2. 将MyDrawable转成Bitmap,设置到RemoteViews的ImageView中;
  3. 给setSmallIcon()传入一个空白的静态资源图标(必填项,避免报错):
// 转换Drawable为Bitmap
MyDrawable mydrawing = new MyDrawable(myText);
int width = mydrawing.getIntrinsicWidth() > 0 ? mydrawing.getIntrinsicWidth() : 48;
int height = mydrawing.getIntrinsicHeight() > 0 ? mydrawing.getIntrinsicHeight() : 48;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
mydrawing.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
mydrawing.draw(canvas);

// 把Bitmap设置到自定义通知布局的ImageView中
mRemoteViews.setImageViewBitmap(R.id.notification_custom_icon, bitmap);

// 设置空白占位图标(需提前在res/drawable下添加空白图标)
mBuilder = new NotificationCompat.Builder(context,"default")
        .setContent(mRemoteViews)
        .setOnlyAlertOnce(true)
        .setAutoCancel(false)
        .setOngoing(true)
        .setSmallIcon(R.drawable.empty_placeholder_icon);

内容的提问来源于stack exchange,提问作者Woncherl Ha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:51:29