在Honeycomb android 3.0中显示Action Bar菜单项的图标

时间:2011-03-07 06:36:48

标签: android android-actionbar android-3.0-honeycomb

你好 我正在使用Honeycomb android 3.0开发一个Android应用程序。我试着在Action Bar中显示一个菜单。菜单上有一个图标和斜角。当我们点击菜单项时,它会以下拉列表的形式显示其项目。下拉列表中的项目包含项目名称,但显示的是图标。我希望在单击菜单时出现的下拉列表中的标题旁边显示一个图标。任何人都可以帮我解决这个问题。我的xml文件如下:

 <?xml version="1.0" encoding="utf-8"?>           
<menu  xmlns:android="http://schemas.android.com/apk/res/android">  
<item          
  android:id="@+id/addserver"  
  android:icon="@android:drawable/ic_menu_add"   
  android:title="Add Server"    
  android:showAsAction="ifRoom|withText"     
>  

<menu>    
            <item android:id="@+id/fileserver"    
                  android:icon="@android:drawable/ic_menu_add"  
                  android:title="File Server"          
                  android:onClick="onCreate"           
                  android:showAsAction="always"/>      
            <item android:id="@+id/sharepoint"            
                  android:icon="@android:drawable/ic_menu_add"  
                  android:title="Share Point"          
                  android:onClick="onCreate" />          
        </menu>            
</item>

最初它会在左侧显示带有图标的添加服务器。点击它将显示fileserver,sharepoint作为下拉列表,带有out图标虽然我给了android:icon语句。
任何人都可以帮我解决这个问题吗?
在此先感谢,

3 个答案:

答案 0 :(得分:10)

操作栏的溢出菜单中未显示图标的行为是设计(截至本文撰写时)。如果你绝对需要使用图标,你需要编写一个自定义实现考虑重新考虑你的设计以适应UI约定。

答案 1 :(得分:2)

实际上,有一种方法可以在菜单项的文本旁边添加图标:

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);

这将在菜单项的开头放置一个图标,就在其原始文本之前。

顺便说一下,这也适用于PopupMenu。

答案 2 :(得分:1)

虽然最初的问题有点陈旧,而且因为推理反对在菜单中显示图标有点缺乏实质内容(参见Steven Elliott的优秀评论Displaying icon for menu items of Action Bar in Honeycomb android 3.0),我想指出一个出色的,有效的解决方案here

@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) { //...
            } catch(Exception e) { // ...
            }
        }
    }
    return super.onMenuOpened(featureId, menu);
}

只需将此代码添加到您的活动中并导入相应的模块即可。再说一次,不是我的工作,而是工作。