アクションバーにメニュー項目があります。メニュー項目の画像とともに、頻繁に変更されるいくつかの番号を表示する必要があります。アクションバーシャーロックを使用していません。使いたくない。これ以外はすべて問題なく動作します。表示されている画像では、白いアイコンの色のアイコンは私のものです。背景が赤色の番号を動的に生成する必要があります。 Androidでそれを行うにはどうすればよいですか?
サンプル画像は次のとおりです。
更新:
このメニュー項目はmenu.xmlにあります。これは、通知数を表示する通知メニュー項目のように機能するはずです。メニューアイコンを次のように設定しました。
menuItem.setIcon(image);
ここで、メニュー項目の上に、通知の総数を含む1つのテキストビューを配置する必要があります。
この機能をviewbadgerで実装することは可能ですか? Github url
ActionViewをメニュー項目に追加し、コードでビューに設定値として取得する方法を発見しました。
ここを参照してください: https://stackoverflow.com/a/16648170/857681
SO私はブログに目を向けました;成功しました。私のために働いたものを共有したいと思います(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;
}
}
数を設定するのに役立つこのクラス。バッジを日付などとして設定するには、さらに多くの方法を実装することをお勧めします。
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);
}
}
そしてmuiimportanteres/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>
頑張ってください!
これがあなたが試すことができる1つのことです:
背景に画像をペイントし、画像の上にテキストをペイントするカスタムDrawable
を作成します。サンプルについては この投稿 をチェックしてください。
次に、このDrawable
をMenuItem
背景として動的に設定します。
アクションビューを使用します。デフォルトのActionBar
とActionBarSherlock
の両方で機能します。
このアプローチでは、独自のView
を作成し(たとえば、レイアウトを膨らませることにより)、アクションビューがViewGroup
など)。