如何在安卓中将溢出菜单项目显示到操作栏

30
我正在编写一个Android应用程序,我试图将溢出菜单项显示到操作栏中,使用这个很好的教程链接:http://wptrafficanalyzer.in/blog/adding-action-items-and-overflow-menu-items-to-action-bar-in-android/
问题:
Not getting Overflow Menu Items (Icon)

请参见下面的屏幕截图以获得更清晰的了解: 输入图像描述 Manifest.xml:
<uses-sdk android:minSdkVersion="14" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" 
        android:uiOptions="splitActionBarWhenNarrow"              
        >

items.xml:

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

<item
    android:id="@+id/computer"
    android:title="@string/computer"
    android:icon="@drawable/computer"
    android:showAsAction="ifRoom|withText"
/>

<item
    android:id="@+id/gamepad"
    android:title="@string/gamepad"
    android:icon="@drawable/gamepad"
    android:showAsAction="ifRoom|withText"
/>

<item
    android:id="@+id/camera"
    android:title="@string/camera"
    android:icon="@drawable/camera"
    android:showAsAction="ifRoom|withText"
/>

<item
    android:id="@+id/video"
    android:title="@string/video"
    android:icon="@drawable/video"
    android:showAsAction="ifRoom|withText"
/>

<item
    android:id="@+id/email"
    android:title="@string/email"
    android:icon="@drawable/email"
    android:showAsAction="ifRoom|withText"
/>
 </menu>

我正在使用这个教程,尝试做出“图6:分割操作栏中的操作项和溢出菜单”

请帮我将溢出菜单项(图标)显示到操作栏中

现在每当我在模拟器中点击菜单按钮时,我都会得到其余的菜单项....


1
将您的ifRoom参数更改为always,以显示所有项目。 - the-ginger-geek
1
您可以在所链接文章的屏幕截图上清晰地看到该设备有返回、主页和任务按钮,因此无法召唤溢出菜单:https://dev59.com/aH_aa4cB1Zd3GeqP78on#23721321 - TWiStErRob
7个回答

58

只是想说,如果你的设备有菜单按钮,溢出图标将不会显示,而在新款手机上会显示溢出按钮。我不建议使用ASMUIRTI的答案,因为它是一种糟糕的hack,会破坏该平台上其他应用程序的一致性。

你必须使用

android:showAsAction="never"

让安卓设备决定是否需要溢出菜单。


3
在某些设备上(我已经测试过Galaxy Tab 3,OS 4.2.2),隐藏项目只能在“菜单”按钮点击时才可用。 - Sergii

47

要在操作栏中显示三个点的图标,只需在您的OnCreate()方法中使用以下方法:

   private void getOverflowMenu() {

    try {
       ViewConfiguration config = ViewConfiguration.get(this);
       Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
       if(menuKeyField != null) {
           menuKeyField.setAccessible(true);
           menuKeyField.setBoolean(config, false);
       }
   } catch (Exception e) {
       e.printStackTrace();
   }
 }

21
这是一个黑客...我肯定不会使用它。接受的答案应该是 Akshat Agarwal 的。 - Habizzle
@max.mustermann 可能这是一个黑客行为,或者无论它是什么,但它运作良好。我在这里看到过这个答案:[https://dev59.com/M2ox5IYBdhLWcg3wTytx] - Stephen
@max.mustermann 这个答案被接受是因为对于一个硬件按钮智能手机,只有通过点击菜单硬件按钮才会显示溢出项。但它不会在操作栏的右上方显示溢出菜单项。更多参考请查看user timo ohr的答案 - Stephen
1
@Naruto,这个问题在问题或答案中都没有指出,或者我漏看了什么;)。在这种情况下,这可能是最好的解决方案。但作为一般建议,我更喜欢使用XML配置而不是通过反射访问私有字段。 - Habizzle
非常好的答案,我正需要它,因为硬件按钮隐藏了溢出图标。 - Corven Dallas
显示剩余2条评论

12

这可能是另一个解决方法,对我非常有帮助。保留一个带有三个点的drawable并将其作为菜单项。

 <menu xmlns:android="http://schemas.android.com/apk/res/android" >


<item
    android:id="@+id/saveDetails"
    android:showAsAction="always"
    android:title="@string/save"/>

<item
    android:id="@+id/menu_overflow"
    android:icon="@drawable/dts"
    android:orderInCategory="11111"
    android:showAsAction="always">
    <menu>
        <item
            android:id="@+id/contacts"
            android:showAsAction="never"
            android:title="Contacts"/>


        <item
            android:id="@+id/service_Tasks"
            android:showAsAction="never"
            android:title="Service Tasks"/>


        <item
            android:id="@+id/charge_summary"
            android:showAsAction="never"
            android:title="Charge Summary"/>


        <item
            android:id="@+id/capture_signature"
            android:showAsAction="never"
            android:title="Capture Signature"/>
    </menu>
</item>

 </menu>

由于某种原因,这是我唯一能让它工作的方法。太奇怪了!(https://dev59.com/aH_aa4cB1Zd3GeqP78on)感谢您的绝妙提示。谢谢! - Fattie

1
如果我理解您的问题正确,您想在操作栏上显示所有图标,则需要更改菜单项中的这些参数。
android:showAsAction="ifRoom|withText"

对于此

android:showAsAction="always"

所以在您的菜单中,您想要使用图标而不是文本来显示溢出项?如果是这样,我认为这是不可能的。 - the-ginger-geek
@Neil他不想将菜单项显示为溢出项,而是只选择某些菜单项。 - Anshul

1
如果你正在使用支持库,为了在操作栏中显示菜单项,你必须在xml中使用以下语法:
yourappname:showAsAction="ifRoom|withText"

0

在 AndroidManifest.xml 文件中添加

android:theme="@android:style/Theme.Holo.Light"

这将在您的应用程序中添加操作栏。

之后,转到menu.xml并添加以下内容

xmlns:tools="http://schemas.android.com/tools

在每个项目之间最后添加

android:showAsAction="always"
tools:ignore="AppCompatResource"

0
具备菜单硬件按钮的手机,在点击该硬件按钮时会显示额外的菜单项。没有菜单硬件按钮的新手机会自动将溢出菜单图标添加到操作栏中。 额外的菜单项是那些设置了“showAsAction”属性为“never”的菜单项。

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