在Honeycomb Android 3.0中显示操作栏菜单项的图标

7
我正在使用Honeycomb android 3.0开发Android应用程序。我试图在操作栏中显示菜单。该菜单具有图标和标题。当我们单击菜单项时,它以下拉列表的形式显示其项目。它显示了下拉列表中的项目名称,但没有图标。
我希望在单击菜单时,在下拉列表中显示标题旁边的图标。有人能帮我解决这个问题吗?我的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>

  

最初它在左侧显示带有图标的“添加服务器”。点击该按钮将显示文件服务器和SharePoint,但是下拉列表没有图标,尽管我已经使用了 android:icon 语句。

您如何解决这个问题?


可能是Actionbar not shown with AppCompat的重复问题。 - Junior Mayhé
可能是如何在ActionBar的溢出菜单中显示图标的重复问题。 - user1931751
3个回答

10

在目前的设计中,动作栏溢出菜单中不显示图标的行为是有意为之。如果您绝对需要使用图标,则应重新考虑设计以适应用户界面惯例。


11
@Android_programmer_camera:请不要动溢出菜单。请不要打破界面模式和约定。请不要给用户(和媒体)更多理由抱怨Android开发人员不遵循UI约定,因此所有Android应用程序看起来和工作方式都不同,这使得使用Android变得困难。再次,请不要动溢出菜单。 - CommonsWare
1
+1 @commonsware,您能否指定Android应用程序必须遵循的UI模式列表。 - Ganapathy C
28
在操作栏菜单中考虑使用子菜单默认使用图标,我认为这是一个完全荒谬的“模式”,那国际化呢?不可能将应用程序翻译成世界上的每一种语言,但我想每个文化都能理解一个漫画气泡或信封菜单项的含义。 - Steven Elliott
10
我完全同意Steven的想法,子菜单有图标而菜单没有?很好的规律!即使在Android中,菜单和子菜单的工作和外观也不同,非常出色。 - devmiles.com
1
@Ganapathy http://developer.android.com/design/patterns/actionbar.html 和 http://developer.android.com/guide/topics/ui/index.html。 - TWiStErRob
显示剩余3条评论

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。

但是,如果您将操作栏设置为显示图标和文本,则每个项目将会有两个图标。 - Ted Hopp
1
@TedHopp 所以不要将其设置为显示2个图标,只使用我所写的内容显示一个单独的图标。 - android developer

1

虽然原问题有点老,而且由于反对在菜单中显示图标的理由缺乏实质性支持(请参见Steven Elliott的优秀评论 Displaying icon for menu items of Action Bar in Honeycomb android 3.0),但我想指出一个很好的、可行的解决方案,该方案是在这里给出的:

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

只需将此代码添加到您的活动中并导入适当的模块。再次说明,这不是我的工作,但仍然有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接