2012-11-26 61 views
12

我在操作欄中有一個菜單項。隨着菜單項圖像,我需要顯示一些與它相關的數字,這些數字會經常改變。我沒有使用Action bar sherlock。我不想使用它。除此之外,其他一切正常。在顯示的圖像中,白色圖標顏色圖標是我的。我需要動態生成帶有紅色背景的數字。我怎麼能在Android中做到這一點?如何在Android中的菜單項上實現動態值

下面是示例圖像:

enter image description here

更新:

我有我的menu.xml文件這個菜單項。這應該像通知菜單項那樣工作,其顯示通知計數的數量。我設置了菜單圖標一樣,

menuItem.setIcon(image); 

現在,我需要把它有通知的總數一個文本視圖菜單項的頂部。

是否有可能使用viewbadger實現此功能? Github url

回答

1

這裏有一兩件事你可以嘗試:

創建一個自定義Drawable是你畫的圖像的背景和文字上的圖像的頂部。查看樣品this post

然後設置這個Drawable爲動態的MenuItem背景...

+0

我會嘗試這 – intrepidkarthi

0

使用行爲視圖。它適用於:默認ActionBarActionBarSherlock

Here is an example

用這種方法你可以創建自己的View(通過虛報一些佈局爲例),然後做你想做的(變化的背景下,變化的內容,動態地添加其他的觀點,如果你的行動的看法是子類ViewGroup等)。

5

了很多努力,所以我轉向了博客的幾乎所有資源後;成功地。我想分享一下我的工作(Api> = 13); source

讓我們先從甜代碼,的方式它是用來

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

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> 

這類方便地使一個BadgeDrawable;它的外觀也可以修改:

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

這個類有助於設置數字。在res/drawable

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


} 

而且MUI重要提示可拉伸性(如佈局):我建議實施更加thods設置徽章日期,等

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

好盧克斯!

+0

是您ic_menu_notifications的層列表文件已在底部所提及的? – Lampard

+0

您剛纔複製從源代碼。請停止這樣做。 – Mahori

+0

@Ravi,那是不是出了什麼我做;源鏈接甚至不再工作;我可以向你保證這段代碼在我發佈之前已經在我的應用中生成;解釋這5個代碼塊如何工作也很重要。 – msysmilu

相關問題