如何获取代码生成的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:
- 先在
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"/>
- 代码中设置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支持,可通过自定义整个通知布局+占位小图标实现:
- 确保自定义通知布局(即你的
mRemoteViews对应的布局)中包含显示自定义图标的ImageView; - 将MyDrawable转成Bitmap,设置到RemoteViews的ImageView中;
- 给
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
相关产品推荐
相关产品推荐

