【问题标题】:Displaying icon for menu items of Action Bar in Honeycomb android 3.0在 Honeycomb android 3.0 中显示操作栏菜单项的图标
【发布时间】:2011-03-07 06:36:48
【问题描述】:


我正在使用 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>

最初它会在左侧显示带有图标的添加服务器。点击它会显示文件服务器,共享点作为没有图标的下拉列表,尽管我给出了 android:icon 语句。
谁能帮我解决这个问题?
提前致谢,

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • @Android_programmer_camera:请不要理会溢出菜单。请不要破坏 UI 模式和约定。请不要给用户(和媒体)更多的理由抱怨 Android 开发人员不遵循 UI 约定,因此所有 Android 应用程序的外观和工作方式都不同,从而难以使用 Android。同样,请不要理会溢出菜单。
  • +1 @commonsware 您能否指定 Android 应用程序 必须遵循的 UI 模式列表。
  • 考虑到actionabar菜单中的子菜单默认使用图标,我认为这是一个完全荒谬的“模式”,那么国际化呢?将应用程序翻译成世界上的每种语言是不可能的,但我想每种文化都会得到气泡或信封菜单项的含义
  • 我绝对同意 Steven 的观点,子菜单有图标而菜单没有?不错的图案!甚至菜单和子菜单在 Android 中的工作方式和外观也不同,非常好。
【解决方案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。

【讨论】:

  • 但是如果你将操作栏设置为显示图标和文本,这将为每个项目提供两个图标。
  • @TedHopp 所以不要将其设置为显示 2 个图标。只有一个,使用我写的。
【解决方案3】:

虽然最初的问题有点老了,而且因为 反对 在菜单中显示图标的推理有些缺乏实质(参见 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);
}

只需将此代码添加到您的活动并导入相应的模块。再说一次,不是我的工作,但我仍然在工作。

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多