我在操作栏的菜单项。 随着菜单项目图像,我需要表现出与它相关的一些数字,这将经常改变。 我不使用操作栏福尔摩斯。 我不想使用。 除了这一切只是正常工作。 在示出的图像中,白图标的颜色图标是我的。 我需要动态生成具有红色背景的数量。 我怎样才能做到这在Android中?
下面是示例图像:
更新:
我在我的menu.xml文件这个菜单项。 这应该工作一样,显示通知计数的数量的通知菜单项。 我设置了菜单图标一样,
menuItem.setIcon(image);
现在,在菜单项的顶部,我需要把它有通知的总数一个文本视图。
是有可能实现与viewbadger这个功能? Github上的url
我发现了如何将的actionView添加到菜单项和检索的设定值在代码视图。
在这里看到: https://stackoverflow.com/a/16648170/857681
经过大量的努力,所以我转向了博客的几乎所有资源; 成功地。 我想分享什么为我工作(API> = 13); 源 。
让我们先从甜美的代码, 它的使用方式 :
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;
}
}
这个类可以帮助设定数值。 我建议实施更加thods设置徽章日期,等:
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重要提示在绘制(如布局) 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>
良好的卢克斯!
这里有一两件事你可以试试:
创建一个自定义Drawable
,在背景和文字上的图像的顶部绘制你的图像。 看看这篇文章的样本。
然后设置这个Drawable
的MenuItem
的背景动态...
使用动作视图。 它的工作原理与两个:默认ActionBar
和ActionBarSherlock
。
下面是一个例子
用这种方法你可以创建自己的View
(通过虚报例如一些布局),然后做你想做的(变化的背景下,变化的内容,动态地添加其他的观点,如果你的行动的看法是子类ViewGroup
等)。