2012-11-26 4 views
12

Ich habe einen Menüpunkt in der Aktionsleiste. Zusammen mit dem Menüpunkt Bild muss ich eine Nummer anzeigen, die sich oft ändert. Ich verwende kein Aktionsleisten-Sherlock. Ich möchte das nicht benutzen. Ansonsten funktioniert alles andere gut. Im abgebildeten Bild gehört das weiße Icon Farbsymbol mir. Ich muss die Nummer mit dem roten Hintergrund dynamisch generieren. Wie kann ich das in Android machen? HierSo implementieren Sie dynamische Werte auf Menüelement in Android

ist das Beispielbild:

enter image description here

Update:

Ich habe diesen Menüpunkt in meinem menu.xml. Dies sollte wie ein Benachrichtigungsmenü funktionieren, das die Anzahl der Benachrichtigungen anzeigt. Ich habe das Menü-Symbol wie,

menuItem.setIcon(image); 

nun oben auf den Menüpunkt Ich brauche eine Textansicht zu platzieren, die die Gesamtzahl der Meldungen hat.

ist es möglich, diese Funktionalität mit viewbadger zu implementieren? Github url

Antwort

1

Dies ist eine Sache, die Sie ausprobieren können:

Erstellen eines benutzerdefinierten Drawable, die Sie Bild im Hintergrund und Text auf dem Bild malen. Überprüfen Sie this post für Probe.

setzen Sie diesen Drawable als MenuItem Hintergrund dynamisch ...

+0

Ich werde dies versuchen – intrepidkarthi

0

Verwenden Aktion Ansicht. Es funktioniert mit beiden: Standard ActionBar und ActionBarSherlock.

Here is an example

Mit diesem Ansatz können Sie einfach erstellen Sie Ihre eigenen View (durch einige Layout zum Beispiel Aufblasen) und dann tun, was Sie wollen (Hintergrund ändern, ändern Inhalt, fügen Sie eine weitere Ansichten dynamisch, wenn Ihre Aktion Ansicht Unterklasse ist von ViewGroup usw.).

5

Nach viel SO fast alle Ressourcen versuchen, auf mich zu Blogs gedreht; erfolgreich. Ich möchte teilen, was bei mir funktioniert hat (Api> = 13); source.

Lassen Sie uns mit dem süßen Code beginnen, die Art und Weise wird es verwendet:

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; 
} 

Die 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> 

Diese Klasse, die eine BadgeDrawable bequem macht; sein Aussehen kann auch geändert werden:

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; 
    } 
} 

Diese Klasse, die hilft, die Nummer festzulegen. Ich empfehle, die Umsetzung noch thoden Abzeichen als Datum, etc:

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


} 

Und MUI importante ein ziehbar (wie ein 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> 

Gute Glück!

+0

Ist Ihre ic_menu_notifications Layer-List-Datei, die Sie in der Unterseite erwähnt haben? – Lampard

+0

Sie haben den Code einfach von der Quelle kopiert. Bitte hör auf damit. – Mahori

+0

@Ravi, das war nicht was ich getan habe; Der Quelllink funktioniert nicht einmal mehr. und ich kann dir versichern, dass dieser Code in meiner App produziert wurde, bevor ich ihn hier gepostet habe; Es ist wichtig zu erklären, wie diese 5 Code-Blöcke funktionieren. – msysmilu