如何实现在安卓上的菜单项动态值[复制](How to implement dynamic value

2019-07-04 02:48发布

这个问题已经在这里有一个答案:

  • 如何获得文本上的动作条图标? 4个回答

我在操作栏的菜单项。 随着菜单项目图像,我需要表现出与它相关的一些数字,这将经常改变。 我不使用操作栏福尔摩斯。 我不想使用。 除了这一切只是正常工作。 在示出的图像中,白图标的颜色图标是我的。 我需要动态生成具有红色背景的数量。 我怎样才能做到这在Android中?

下面是示例图像:

更新:

我在我的menu.xml文件这个菜单项。 这应该工作一样,显示通知计数的数量的通知菜单项。 我设置了菜单图标一样,

 menuItem.setIcon(image);

现在,在菜单项的顶部,我需要把它有通知的总数一个文本视图。

是有可能实现与viewbadger这个功能? Github上的url

Answer 1:

我发现了如何将的actionView添加到菜单项和检索的设定值在代码视图。

在这里看到: https://stackoverflow.com/a/16648170/857681



Answer 2:

经过大量的努力,所以我转向了博客的几乎所有资源; 成功地。 我想分享什么为我工作(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>

良好的卢克斯!



Answer 3:

这里有一两件事你可以试试:

创建一个自定义Drawable ,在背景和文字上的图像的顶部绘制你的图像。 看看这篇文章的样本。

然后设置这个DrawableMenuItem的背景动态...



Answer 4:

使用动作视图。 它的工作原理与两个:默认ActionBarActionBarSherlock

下面是一个例子

用这种方法你可以创建自己的View (通过虚报例如一些布局),然后做你想做的(变化的背景下,变化的内容,动态地添加其他的观点,如果你的行动的看法是子类ViewGroup等)。



文章来源: How to implement dynamic values on menu item in Android [duplicate]