2010-08-27 13 views
10

Quiero mostrar una notificación que muestra un ícono en la barra de estado, hasta ahora todo bien, pero en realidad me gustaría que este ícono sea una cadena de 3 caracteres.Convertir cadena en dibujable

Así que mi pregunta es: ¿hay alguna manera de convertir mi Cadena en Drawable para mostrarla como icono en la barra de estado?

EDIT: He encontrado recientemente una aplicación para la que hace algo similar - Indicador de batería

Muestra el nivel actual de la batería como icono de notificación en la barra de estado - Me pregunto si realmente utiliza diferentes 100 imágenes

Screenshot

+3

sólo en caso de que alguien está interesado: Me di cuenta de que la aplicación se ha mencionado anteriormente en realidad utiliza una imagen por valor – DonGru

+0

Esto es exactamente lo que necesito.¿Encontró una solución, además de crear 100 png (por cada valor de ppp) con el estado de la batería? – vault

Respuesta

3

Corto: No, no se puede.

Largo: La notificación necesita un R.drawable.something para el icono y no puede crearlo en tiempo de ejecución.

0

¿Has mirado las Demos de la API> Aplicación> Notificaciones> Barra de estado?

Si tiene un número limitado de opciones de Cadena (como Smileys) puede crear dibujos para cada una de esas Cadenas.

+0

Me gustaría evitar eso ya que es un número bastante grande de posibilidades :) – DonGru

2

puede hacer su propio dibujo personalizado que funcionaría igual que el widget de vista de texto, excepto que es un dibujo en lugar de una vista. La clase textview es solo un contenedor para el dibujable que contiene el texto.

+0

¿podría por favor proporcionar al menos un borrador del código que haría eso? – vault

+2

@vault No tengo una muestra, pero lo que querrá hacer es extender Drawable y anular draw (Canvas) y luego llamar a canvas.drawText() desde draw. – schwiz

0

No, no puede, pensé que podría usar el mismo método que aquí: Combine image and text to drawable, pero no puede, ya que la notificación toma una identificación dibujable, no es un objeto dibujable.

4
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;} 
    } 
+0

.setSmallIcon (int) toma int como entrada ¿cómo usaré drawable allí? –

1

he utilizado una solución y ha funcionado adecuadamente para mí.

Primera i convertir la cadena de mapa de bits y luego convertirlo a un estirable, aquí está el código:

byte [] encodeByte=Base64.decode(":",Base64.DEFAULT); 
Bitmap bitmap=BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);  
Drawable d = new BitmapDrawable(bitmap); 

espero que ayude!

+0

.setSmallIcon (int) tomar int como entrada ¿cómo voy a usar drawable allí? –

+0

Solo puede usarlo en el método .setLargIcon que toma un dibujar como parámetro, smallIcon solo acepta un recurso. – Gilson

+0

Intenté usar set setLargIcon Pero el icono nunca está visible. ¿Cuándo se mostrará el ícono grande? –

-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); 
0

(Sé que esto no responde a la pregunta de la OP totalmente, pero el título me tiene aquí, ya que es bastante general.)

Después de juguetear un poco, se me ha ocurrido con esta solución . Es bastante desordenado y probablemente podría mejorarse, pero funciona.

En su forma actual, la función toma la primera letra de la cadena que se pasa y una identificación única para esa cadena. La ID solo se utiliza para la generación de color de fondo y recordarlo, por lo que se puede quitar si va a utilizar un color constante.

He hecho esto para generar imágenes predeterminadas para contactos que no tienen imágenes guardadas, pero debe ser fácil de adaptar. También sucede que devuelve un InputStream en lugar de un Drawable, pero puede simplemente devolver bitmap después de dibujar en él, o usar 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); 
}