Ответ 1
Короткая: Нет, вы не можете.
Длинно: для значка требуется R.drawable.something
для уведомления, и вы не можете его создать во время выполнения.
Я хочу поднять уведомление, отображающее значок в строке состояния - настолько хорошо, но на самом деле я хотел бы, чтобы этот значок представлял собой строку с тремя символами.
Итак, мой вопрос: есть ли способ преобразовать мою строку в Drawable
, чтобы отобразить ее как значок в строке состояния?
EDIT: Недавно я нашел приложение, которое делает что-то похожее - Индикатор батареи
Показывает текущий уровень заряда аккумулятора в виде значка уведомления в строке состояния - интересно, действительно ли он использует разные 100 изображений
Короткая: Нет, вы не можете.
Длинно: для значка требуется R.drawable.something
для уведомления, и вы не можете его создать во время выполнения.
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;}
}
вы можете создать свой собственный пользовательский чертеж, который будет работать так же, как и виджет textview, за исключением того, что он предназначен для рисования вместо представления. Класс textview - это просто контейнер для drawable, который содержит текст.
Я использовал обходной путь, и он работал правильно для меня.
Сначала я преобразую строку в растровое изображение, а затем преобразую ее в drawable, вот код:
byte [] encodeByte=Base64.decode(":",Base64.DEFAULT);
Bitmap bitmap=BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
Drawable d = new BitmapDrawable(bitmap);
Надеюсь, что это поможет!
Вы просмотрели API Demos > App > Уведомления > Строка состояния?
Если у вас ограниченное количество параметров String (например, Smileys), вы можете создавать чертежи для каждой из этих строк.
Нет, вы не можете, я думал, что вы можете использовать тот же метод, что и здесь: Объединить изображение и текст с возможностью рисования, но вы не можете, поскольку уведомление принимает выталкиваемый идентификатор, а не объект с возможностью рисования.
(Я знаю, что это не полностью отвечает на вопрос OP, но название получило меня здесь, поскольку оно довольно общее.)
После небольшого поворота я придумал это решение. Это довольно грязно и, вероятно, может быть улучшено, но оно работает.
В его текущей форме функция принимает первую букву переданной строки и уникальный идентификатор для этой строки. Идентификатор используется только для генерации фона и запоминания его, поэтому его можно удалить, если вы собираетесь использовать устойчивый цвет.
Я сделал это для создания изображений по умолчанию для контактов, у которых нет сохраненных изображений, но их легко адаптировать. Также случается возвращать 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);
}
try {
InputStream inputStream = new URL(Your imageWebAddress).openStream();
drawable = Drawable.createFromStream(inputStream, null);
inputStream.close();
}
catch (MalformedURLException ex) { }
catch (IOException ex) { }
layout.setBackground(drawable);