先来看效果图
csdn上居然无法显示图片,可查看http://www.eoeandroid.com/forum.php?mod=viewthread&tid=297603&page=1&extra=&_dsign=bc38e135
在android4.0之后你会发现menu.setIcon(**);之后,menu中依然无法显示图标。
查看源码发现在ListMenuItemView这个类中有如下判断:
public void setIcon(Drawable icon) {
final boolean showIcon = mItemData.shouldShowIcon() || mForceShowIcon;
if (!showIcon && !mPreserveIconSpacing) {
return;
}
if (mIconView == null && icon == null && !mPreserveIconSpacing) {
return;
}
if (mIconView == null) {
insertIconView();
}
if (icon != null || mPreserveIconSpacing) {
mIconView.setImageDrawable(showIcon ? icon : null);
if (mIconView.getVisibility() != VISIBLE) {
mIconView.setVisibility(VISIBLE);
}
} else {
mIconView.setVisibility(GONE);
}
}
当showIcon为false时直接return了,是不显示icon的,也就是说我们只要让
mItemData.shouldShowIcon()为true即可,
shouldShowIcon()方法实际调用的是MenuBuilder中的
boolean getOptionalIconsVisible() {
return mOptionalIconsVisible;
}
在MenuBuilder中mOptionalIconsVisible这个属性提供了set方法,但此方法从始至终没有被调用过,导致mOptionalIconsVisible的值一直为false,所以是不显示icon的。
由于MenuBuilder处于com.android.internal包中,是无法直接调用的,
因此,我们在创建menu时只要通过反射机制调用MenuBuilder对象的setOptionalIconsVisible(true)即可显示icon了