Android支持操作栏未显示溢出菜单

7
我的安卓应用支持2.2及以上版本。我正在使用appcompat支持库来实现操作栏,因此只有在有内容不适合时才会显示。我希望我的操作栏支持溢出按钮(三个竖直方块),当点击后可以显示其他项目的菜单。
在我的菜单文件中,我设置了三个项目。但是在应用程序中,我只看到其中两个项目,而且溢出按钮也没有显示。
activity_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:sord.ids_connect="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_settings"
        android:icon="@drawable/checkbox"
        android:title="@string/action_settings"
        sord.ids_connect:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_settings2"
        android:icon="@drawable/checkbox_checked"
        android:title="@string/action_settings"
        sord.ids_connect:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_settings3"
        android:icon="@drawable/ic_launcher"
        android:title="@string/action_settings"
        sord.ids_connect:showAsAction="ifRoom" />  

</menu>

Java文件

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;

public class Activity_Menu extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_menu, menu);
        //return true;
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                super.onBackPressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

清单文件
    <activity
        android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
        android:name="sord.ids_connect.Activity_Menu"
        android:screenOrientation="portrait"
        android:label="@string/title_activity_menu" >
    </activity>

1
您是否按下了设备或模拟器上的“菜单”按钮?在模拟器上,“菜单”按钮被映射为PgUp。 - CommonsWare
我正在手机上进行测试,当我按菜单按钮时,我看到菜单出现在底部,只有一个选项显示为“设置”,而且当我的菜单文件中有3个项目时,为什么只有一个选项显示在那里? - omega
7个回答

15

通用参考

1 - 覆盖onCreateOption并填充菜单

注意事项

无论你是返回true还是调用super,都没有关系。

@Override

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_menu, menu);
    return super.onCreateOptionsMenu(menu);
}

2 - 将命名空间添加到menu.xml文件中。

xmlns:**yourapp**="http://schemas.android.com/apk/res-auto"

3 - 将showAsAction设置为alwaysifRoom

**yourapp**:showAsAction="ifRoom"

4 - 如果您正在使用appcompat,请确保您的Activity继承自ActionBarActivity,您无需更改ActionBar的任何值即可在栏中看到您的menuOption。

最后,您将拥有类似于[记得为yourapp使用适当的命名空间]的东西。

main.xml

<item
    android:id="@+id/action_settings"
    android:icon="@drawable/ic_action_settings"
    android:title="@string/action_settings"
    yourapp:showAsAction="ifRoom" />

在你的活动中

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

yourapp:showAsAction="ifRoom"这个技巧让它起作用 - 即使有物理按钮,也会显示菜单项。 - Master
如何在Java中不使用XML完成此操作? - Roger Keays
好的,我在SupportMenuItem.setShowAsAction()中找到了它。 - Roger Keays
嗨@eOnOe..我完全按照您的指示操作,但仍无法使溢出显示..奇怪..https://dev59.com/aH_aa4cB1Zd3GeqP78on - Fattie

8
如果您正在使用支持库,则需要在自己的命名空间中声明showAsAction,如下所示 app:showAsAction 。有关此内容,可以参考eOnOe的答案。 使用 android:showAsAction 将无法与支持库一起使用,因为它使用自己的操作栏实现,而不是框架的实现。 您还可以随时将项分组到图标中,例如:
<item ... 
      android:icon="@drawable/abs__ic_menu_moreoverflow_holo_dark">
  <menu>    
   <item .../>
   <item .../>
  </menu>
</item>

2

如果您的Android设备没有菜单按钮,则只会显示溢出菜单。当然,您可以创建一个默认适用于所有设备的hack,但这不是推荐的解决方案。对于每个项目,请添加android:showAsAction="never",这意味着如果您的设备没有菜单按钮,则会显示溢出菜单。


1
我正在手机上进行测试,当我按菜单按钮时,我看到菜单出现在底部,只有一个选项,显示为“设置”。
那就是溢出。
另外,为什么只有1个选项显示在那里,当我的菜单文件中有3个项目?
因为其他两个在操作栏中。您指定了"ifRoom",只有两个位置,而不是三个。

哦,我明白了,但是我该如何让三个点的按钮出现在顶部? - omega
@omega:在没有菜单按钮的设备上,以及运行Android 4.4及更高版本的任何设备上,它将显示在顶部。欲了解更多信息,请参阅我的博客文章:http://commonsware.com/blog/2013/12/09/menu-key-dead-again.html - CommonsWare
@omega:你可以尝试在Activity上使用openOptionsMenu(),虽然这应该是不必要的。 - CommonsWare
@omega: "关于“Activity”的意思是什么" -- Activity 是一个类。openOptionsMenu()Activity 类的一个方法。你可以在你的 Activity 上调用 openOptionsMenu(),看看是否打开了溢出菜单。 - CommonsWare

0

你需要按以下方式布局菜单

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:sord.ids_connect="http://schemas.android.com/apk/res-auto">
<item
    android:id="@+id/action_container"
    android:title="Menu"
    android:showAsAction="never">        
<item
    android:id="@+id/action_settings"
    android:icon="@drawable/checkbox"
    android:title="@string/action_settings"
    sord.ids_connect:showAsAction="ifRoom" />

<item
    android:id="@+id/action_settings2"
    android:icon="@drawable/checkbox_checked"
    android:title="@string/action_settings"
    sord.ids_connect:showAsAction="ifRoom" />

<item
    android:id="@+id/action_settings3"
    android:icon="@drawable/ic_launcher"
    android:title="@string/action_settings"
    sord.ids_connect:showAsAction="ifRoom" />  
</item>

</menu> 

0
     Change Your menu.xml with the following code.




    <menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:sord.ids_connect="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_container"
        android:title="Menu"
       android:showAsAction="always">        
    <item
        android:id="@+id/action_settings"
        android:icon="@drawable/checkbox"
        android:title="@string/action_settings"
        android:showAsAction="always"/>

    <item
        android:id="@+id/action_settings2"
        android:icon="@drawable/checkbox_checked"
        android:title="@string/action_settings"
        android:showAsAction="always" />

    <item
        android:id="@+id/action_settings3"
        android:icon="@drawable/ic_launcher"
        android:title="@string/action_settings"
        android:showAsAction="always" />  
    </item>

    </menu> 

-2

我曾经遇到过同样的问题,我通过以下方法解决了它:

1)注释掉return true;

2)取消注释return super.onKeyUp(keyCode, event);

在公共方法boolean onKeyUp(int keyCode, KeyEvent event)中。


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