我想在状态栏中显示一个显示图标的通知 - 到目前为止一直很好,但实际上我希望这个图标是3个字符的字符串。
所以我的问题是:有没有办法将我的String转换为Drawable
以在状态栏中将其显示为Icon?
编辑:我最近发现了一个类似的应用程序 - 电池指示器
它将当前电池电量显示为状态栏中的通知图标 - 我想知道它是否真的使用了不同的100张图像
答案 0 :(得分:3)
简短:不,你不能。
长:图标通知需要R.drawable.something
,您无法在运行时创建。
答案 1 :(得分:3)
public Drawable getDrawable(String bitmapUrl) {
try {
URL url = new URL(bitmapUrl);
Drawable d =new BitmapDrawable(BitmapFactory.decodeStream(url.openConnection().getInputStream()));
return d;
}
catch(Exception ex) {return null;}
}
答案 2 :(得分:2)
你可以创建自己的自定义drawable,就像textview小部件一样,除了它是drawable而不是view。 textview类只是包含文本的drawable的容器。
答案 3 :(得分:1)
我使用了一种解决方法,它适合我。
首先我将字符串转换为位图,然后将其转换为drawable,这是代码:
byte [] encodeByte=Base64.decode(":",Base64.DEFAULT);
Bitmap bitmap=BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
Drawable d = new BitmapDrawable(bitmap);
希望它有所帮助!
答案 4 :(得分:0)
您是否看过API演示>应用>通知>状态栏?
如果您有少量的String选项(如Smileys),您可以为每个字符串创建drawable。
答案 5 :(得分:0)
不,你不能,我认为你可以使用与此处相同的方法:Combine image and text to drawable,但你不能,因为通知采用可绘制的id,而不是可绘制的对象。
答案 6 :(得分:0)
(我知道这并没有完全回答OP的问题,但标题让我来到这里,因为它非常普遍。)
在摆弄了一下之后,我已经提出了这个解决方案。它非常混乱,可能会有所改进,但它确实有效。
在当前形式中,该函数接受它传递的String的第一个字母以及该String的唯一ID。该ID仅用于生成背景颜色并记住它,因此如果您要使用稳定的颜色,则可以将其删除。
我这样做是为没有保存图像的联系人生成默认图像,但应该很容易适应。它也恰好返回一个InputStream而不是Drawable,但您可以在绘制后返回bitmap
,或者使用Drawable.createFromStream()
。
private static InputStream returnDefaultContact(Context context, String name, long id) {
Paint textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setTextSize(110);
int color = PreferenceManager.getDefaultSharedPreferences(context).getInt("contact_by_id_" + id, 0);
if (color == 0) {
int colorValue1 = (int)((56 + Math.random() * 200));
int colorValue2 = (int)((56 + Math.random() * 200));
int colorValue3 = (int)((56 + Math.random() * 200));
color = Color.rgb(colorValue1, colorValue2, colorValue3);
PreferenceManager.getDefaultSharedPreferences(context).edit().putInt("contact_by_id_" + id, color).apply();
}
Paint backgroundPaint = new Paint();
backgroundPaint.setColor(color);
Bitmap bitmap = Bitmap.createBitmap(120, 120, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, canvas.getHeight() / 2, backgroundPaint);
int xPos = (canvas.getWidth() / 2);
int yPos = (int) ((canvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2)) ;
canvas.drawText(name.substring(0, 1), xPos, yPos, textPaint);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] imageInByte = stream.toByteArray();
return new ByteArrayInputStream(imageInByte);
}
答案 7 :(得分:-1)
try {
InputStream inputStream = new URL(Your imageWebAddress).openStream();
drawable = Drawable.createFromStream(inputStream, null);
inputStream.close();
}
catch (MalformedURLException ex) { }
catch (IOException ex) { }
layout.setBackground(drawable);