更改PopupMenu中单个项目的文本颜色

时间:2015-03-27 15:49:58

标签: android popupmenu

我在用户点击图片时会显示一个弹出菜单。使用的代码是:

PopupMenu popupMenu = new PopupMenu(mContext, mImageView);
popupMenu.setOnMenuItemClickListener(MyClass.this);
popupMenu.inflate(R.menu.menu_my_class_options);
popupMenu.show();

菜单有三个动作,我希望其中一个文本的颜色为红色(而不是黑色)。

这可能吗? 我找到了一些答案(例如here),说明如何使用活动的选项菜单执行此操作,但是他们需要访问{{1}方法......

提前致谢。

- 编辑 -

菜单文件:

onCreateOptionsMenu

3 个答案:

答案 0 :(得分:7)

您可以按照以下步骤实现此目的。

在你的style.xml中---添加行

<style name="style" parent="android:Theme.Holo.Light"> 
    <item name="textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceColor</item>
    <item name="android:popupMenuStyle">@style/myPopupMenuStyle</item>

</style>

以下代码

<style name="myPopupMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu">

</style>
<style name="myPopupMenuTextAppearanceColor" parent="@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Small">
    <item name="android:textColor">#000000(Your Color Code)</item>
</style>

单个菜单项颜色的更新

对于单一菜单项颜色,您只需使用以下代码

即可
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu, menu);

    int positionOfMenuItem = 0; 
// 0 or whatever your item position at which you want to change the color...
    MenuItem item = menu.getItem(positionOfMenuItem);
    SpannableString s = new SpannableString("My red MenuItem");
    s.setSpan(new ForegroundColorSpan(Color.RED//your color), 0, s.length(), 0);
    item.setTitle(s);
}

答案 1 :(得分:2)

我知道这个答案是迟来的,但也许对某些人有用。尝试使用此

<string name="action_delete_shipment"><font fgcolor='#FF1400'>Delete Shipment</font></string>

答案 2 :(得分:0)

根据@Shadik Khan的回答,实际上,您只需要创建SpannableString,更改颜色或将其放入菜单列表之前就可以更改颜色。像下面一样

if (messageActionMap.keyAt(i) == LIST_ITEM_DELETE) {
                    SpannableString itemRecall = new SpannableString(messageActionMap.valueAt(i));
                    itemRecall.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.red)), 0, itemRecall.length(), 0);
                    mMessagePopupMenu.getMenu().add(Menu.NONE, messageActionMap.keyAt(i), 1, itemRecall);
                }