除了溢出下拉菜单中的菜单项标题之外,我还想显示图标。
有可能吗?
将您的菜单与属性放在一起, android:showAsAction="always"
并在菜单的 xml 文件中添加子菜单,如下所示
<item
android:id="@+id/mainMenu"
android:icon="@drawable/launcher"
android:showAsAction="always">
<menu>
<item
android:id="@+id/menu_logout"
android:icon="@drawable/log_out"
android:title="logout"/>
</menu>
</item>
这将在菜单中显示图标
其实有一个简单的方法可以实现,因为你看到的其实是一个TextView,所以你设置一个span,例如:
final MenuItem menuItem=...
final ImageSpan imageSpan=new ImageSpan(this,R.drawable.ic_stat_app_icon);
final CharSequence title=" "+menuItem.getTitle();
final SpannableString spannableString=new SpannableString(title);
spannableString.setSpan(imageSpan,0,1,0);
menuItem.setTitle(spannableString);
这将在菜单项的开头放置一个图标,就在其原始文本之前。
@Override
public boolean onMenuOpened(int featureId, Menu menu)
{
if(featureId == Window.FEATURE_ACTION_BAR && menu != null){
if(menu.getClass().getSimpleName().equals("MenuBuilder")){
try{
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
}
catch(NoSuchMethodException e){
Log.e(TAG, "onMenuOpened", e);
}
catch(Exception e){
throw new RuntimeException(e);
}
}
}
return super.onMenuOpened(featureId, menu);
}
讨厌这样的答案,但我还不够好,无法给出更好的答案。
菜单溢出项的图标是 submenu2 行“subMenu2Item.setIcon(R.drawable.ic_launcher);” 只需将 ic_launcher 替换为您的图标文件(在程序的 res 可绘制目录中)。希望您的意思是使用 ActionBarSherlock。
行 subMenu1Item.setIcon(R.drawable.ic_launcher); 用于顶部菜单按钮的 ActionBar 图标。
回应“这在设计上是不可能的”
非常感谢谷歌试图接管世界并让我们顺其自然,但是......谷歌太不一致了,不会因为不一致而脾气暴躁。如果 Google 可以为他们提供的每“一组”API 做一个例子,那就太好了。有对代码的 API 引用,但没有关于如何将它们组合在一起的示例,我只想要一个可以作为 APK 运行的完整工作示例。我可以从那里欺骗它。如果他们可以花时间编写 APK,那么在标准模板上编写一个小示例会有多困难?对于 30% 的一切,要求并不高。那天我和微软也有同样的争论,但当时也没有发生。因此,您会得到stackoverflow。:
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
SubMenu subMenu1 = menu.addSubMenu("Action Item");
subMenu1.add("Help");
subMenu1.add("About");
MenuItem subMenu1Item = subMenu1.getItem();
subMenu1Item.setIcon(R.drawable.ic_launcher);
subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
SubMenu subMenu2 = menu.addSubMenu("All Options");
subMenu2.add("Help");
subMenu2.add("About");
MenuItem subMenu2Item = subMenu2.getItem();
subMenu2Item.setIcon(R.drawable.ic_launcher);
return super.onCreateOptionsMenu(menu);
}
也许你和我有同样的问题。所以对我来说,如果你使用 AppCompat 解决方案很简单,只是不要使用这个属性:
android:showAsAction="always"
而是像这样使用它:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/option"
android:title="@string/option"
android:icon="@drawable/option"
app:showAsAction="always">
</item>
</menu>
附加的xmlns:app和showAsAction是app的属性有所不同。
希望它可以帮助某人。
This is not possible by design (at least in HC - and I'm developing on API 16 and getting no icons either). Google does not want us to do that.
For a bit of discussion on the topic, see related answer here:
As one of the comments suggests, if you need the icons, consider using a dropdown menu, rather than the overflow menu.