2012-11-26 7 views
12

Ho una voce di menu nella barra delle azioni. Insieme all'immagine della voce del menu, ho bisogno di mostrare qualche numero associato che cambierà spesso. Non sto usando lo sherlock della barra delle azioni. Non voglio usarlo. Oltre a questo, tutto il resto funziona perfettamente. Nell'immagine mostrata, l'icona del colore dell'icona bianca è mia. Ho bisogno di generare il numero con lo sfondo di colore rosso in modo dinamico. Come posso farlo in Android?Come implementare i valori dinamici sulla voce di menu in Android

Qui è l'immagine del campione:

enter image description here

Aggiornamento:

ho questa voce di menu nel mio menu.xml. Questo dovrebbe funzionare come una voce di menu di notifica che mostra il numero di conteggio delle notifiche. Ho impostato l'icona del menu, come,

menuItem.setIcon(image); 

Ora, sulla parte superiore della voce di menu che ho bisogno di mettere un punto di vista del testo che ha il numero totale di notifiche.

è possibile implementare questa funzionalità con viewbadger? Github url

risposta

1

Ecco una cosa che si può provare:

Creare un costume Drawable che si dipinge l'immagine sullo sfondo e testo sulla parte superiore dell'immagine. Controlla this post per esempio.

Poi impostare questa Drawable come MenuItem sfondo dinamico ...

+0

Proverò questo – intrepidkarthi

0

vista Usa azione. Funziona con entrambi: default ActionBar e ActionBarSherlock.

Here is an example

Con questo approccio si può solo creare il proprio View (gonfiando alcuni layout per esempio) e poi fai quello che vuoi (cambiamento di fondo, Contenuti, aggiungere un altro vista dinamico se la vostra vista l'azione è sottoclasse di ViewGroup ecc.).

5

Dopo un sacco di cercare di quasi tutte le risorse su così mi rivolsi ai blog; con successo. Voglio condividere ciò che ha funzionato per me (Api> = 13); source.

Cominciamo con il codice dolce, il modo in cui è utilizzato:

public boolean onCreateOptionsMenu(Menu menu) { 
    //inflate menu 
    getMenuInflater().inflate(R.menu.menu_my, menu); 

    // Get the notifications MenuItem and LayerDrawable (layer-list) 
    MenuItem item = menu.findItem(R.id.action_notifications); 
    LayerDrawable icon = (LayerDrawable) item.getIcon(); 

    // Update LayerDrawable's BadgeDrawable 
    Utils2.setBadgeCount(this, icon, 2); 

    return true; 
} 

Il menu_my.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_notifications" 
     android:icon="@drawable/ic_menu_notifications" 
     android:title="Notifications" 
     app:showAsAction="always" /> 
</menu> 

Questa classe che rende comodamente un BadgeDrawable; il suo aspetto può anche essere modificato:

public class BadgeDrawable extends Drawable { 

    private float mTextSize; 
    private Paint mBadgePaint; 
    private Paint mTextPaint; 
    private Rect mTxtRect = new Rect(); 

    private String mCount = ""; 
    private boolean mWillDraw = false; 

    public BadgeDrawable(Context context) { 
     //mTextSize = context.getResources().getDimension(R.dimen.badge_text_size); 
     mTextSize = 12F; 

     mBadgePaint = new Paint(); 
     mBadgePaint.setColor(Color.RED); 
     mBadgePaint.setAntiAlias(true); 
     mBadgePaint.setStyle(Paint.Style.FILL); 

     mTextPaint = new Paint(); 
     mTextPaint.setColor(Color.WHITE); 
     mTextPaint.setTypeface(Typeface.DEFAULT_BOLD); 
     mTextPaint.setTextSize(mTextSize); 
     mTextPaint.setAntiAlias(true); 
     mTextPaint.setTextAlign(Paint.Align.CENTER); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     if (!mWillDraw) { 
      return; 
     } 

     Rect bounds = getBounds(); 
     float width = bounds.right - bounds.left; 
     float height = bounds.bottom - bounds.top; 

     // Position the badge in the top-right quadrant of the icon. 
     float radius = ((Math.min(width, height)/2) - 1)/2; 
     float centerX = width - radius - 1; 
     float centerY = radius + 1; 

     // Draw badge circle. 
     canvas.drawCircle(centerX, centerY, radius, mBadgePaint); 

     // Draw badge count text inside the circle. 
     mTextPaint.getTextBounds(mCount, 0, mCount.length(), mTxtRect); 
     float textHeight = mTxtRect.bottom - mTxtRect.top; 
     float textY = centerY + (textHeight/2f); 
     canvas.drawText(mCount, centerX, textY, mTextPaint); 
    } 

    /* 
    Sets the count (i.e notifications) to display. 
    */ 
    public void setCount(int count) { 
     mCount = Integer.toString(count); 

     // Only draw a badge if there are notifications. 
     mWillDraw = count > 0; 
     invalidateSelf(); 
    } 

    @Override 
    public void setAlpha(int alpha) { 
     // do nothing 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
     // do nothing 
    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.UNKNOWN; 
    } 
} 

Questa classe consente di impostare il numero. Mi consiglia di attuazione ancora più direzione tecnica di impostare distintivo come la data, ecc:

public class Utils2 { 
    public static void setBadgeCount(Context context, LayerDrawable icon, int count) { 

     BadgeDrawable badge; 

     // Reuse drawable if possible 
     Drawable reuse = icon.findDrawableByLayerId(R.id.ic_badge); 
     if (reuse != null && reuse instanceof BadgeDrawable) { 
      badge = (BadgeDrawable) reuse; 
     } else { 
      badge = new BadgeDrawable(context); 
     } 

     badge.setCount(count); 
     icon.mutate(); 
     icon.setDrawableByLayerId(R.id.ic_badge, badge); 
    } 


} 

E mui Importante un disegnabile (come un layout) in res/drawable:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/ic_notification" 
     android:drawable="@drawable/ice_skate" 
     android:gravity="center" /> 

    <!-- set a place holder Drawable so android:drawable isn't null --> 
    <item 
     android:id="@+id/ic_badge" 
     android:drawable="@drawable/ice_skate" /> 
</layer-list> 

buone fortuna!

+0

Il tuo ic_menu_notifications è il file di elenco dei livelli che hai menzionato in fondo? – Lampard

+0

Hai appena copiato il codice dalla sorgente. Per favore, smettila di farlo. – Mahori

+0

@Ravi, non è quello che ho fatto; il link sorgente non funziona nemmeno più; e posso assicurarti che questo codice era in produzione sulla mia app prima di averlo postato qui; è importante spiegare come funzionano anche questi 5 blocchi di codice. – msysmilu

Problemi correlati