2010-08-27 19 views
10

Voglio sollevare una notifica che mostri un'icona nella barra di stato - finora così buona, ma in realtà vorrei che questa icona fosse una stringa di 3 caratteri.Converti una stringa in Drawable

Quindi la mia domanda è: c'è un modo per convertire la mia stringa in un Drawable per visualizzarlo come icona nella barra di stato?

EDIT: ho recentemente trovato un app che fa qualcosa di simile - Indicatore della batteria

Essa mostra il livello della batteria corrente come icona di notifica nella barra di stato - mi chiedo se usa davvero diversi 100 immagini

Screenshot

+3

solo nel caso in cui qualcuno è interessato: ho capito che la domanda di cui sopra usa in realtà una sola immagine per valore – DonGru

+0

Questo è esattamente quello che mi serve.Hai trovato una soluzione, oltre a creare 100 png (per ogni valore dpi) con lo stato della batteria? – vault

risposta

3

Breve: No, non è possibile.

Long: la notifica necessita di R.drawable.something per l'icona e non è possibile crearla in fase di esecuzione.

0

Hai guardato le demo dell'API> App> Notifiche> Barra di stato?

Se si dispone di un numero limitato di opzioni di stringa (come le emoticon), è possibile creare i drawable per ciascuna di quelle stringhe.

+0

Vorrei evitarlo visto che è un gran numero di possibilità :) – DonGru

2

è possibile creare un proprio drawable personalizzato che funzioni come il widget di visualizzazione testo tranne che è un drawable anziché una vista. La classe textview è solo un contenitore per il drawable che contiene il testo.

+0

puoi per favore fornire almeno una bozza di codice che lo farebbe? – vault

+2

@vault Non ho un campione, ma quello che vorrete fare è estendere Drawable e override draw (Canvas), quindi chiamate canvas.drawText() dal draw. – schwiz

0

No, non è possibile, ho pensato che si potesse usare lo stesso metodo come qui: Combine image and text to drawable, ma non è possibile, poiché la notifica accetta un ID estraibile, non un oggetto estraibile.

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) accetta int come input come userò drawable lì? –

1

Ho usato una soluzione e ha funzionato correttamente per me.

Prima i convertire la stringa bitmap e quindi convertirlo in un disegnabile, ecco il codice:

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

Speranza che aiuta!

+0

.setSmallIcon (int) accetta int come input come userò drawable lì? –

+0

Puoi usarlo solo sul metodo .setLargIcon che accetta un parametro come parametro, smallIcon accetta solo una risorsa. – Gilson

+0

Ho provato a utilizzare set setLargIcon ma l'icona non è mai visibile. quando verrà visualizzata l'icona 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

(so che questo non risponde pienamente alla domanda del PO, ma il titolo mi ha fatto qui in quanto è abbastanza generale.)

Dopo armeggiare un po 'intorno, mi è venuta in mente questa soluzione . È piuttosto disordinato e potrebbe probabilmente essere migliorato, ma funziona.

Nella sua forma attuale, la funzione prende la prima lettera della Stringa passata e un ID univoco per quella Stringa. L'ID viene utilizzato solo per la generazione del colore di sfondo e per ricordarlo, quindi può essere rimosso se si utilizzerà un colore fisso.

Ho fatto questo per generare immagini predefinite per i contatti che non hanno immagini salvate, ma dovrebbe essere facile da adattare. Capita anche di restituire un InputStream invece di un Drawable, ma puoi semplicemente restituire bitmap dopo averlo disegnato, oppure usare 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); 
}