菜单项未显示在操作栏上

时间:2013-08-02 06:22:37

标签: android android-actionbar

我做了一个全新的项目。我已将项目添加到menu布局文件中。这些项目不会显示在操作栏的右侧。我记得有一个带有三个点的图标会打开菜单。

enter image description here

这是我的Activity

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getActionBar();
        actionBar.setBackgroundDrawable(new ColorDrawable(Color.BLUE));     
        actionBar.show();
    }

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

}

这是我的main.xml

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

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_option1"/>
    <item
        android:id="@+id/action_settings34"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_option2"/>
    <item
        android:id="@+id/action_settings3"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_option3"/>


</menu>

12 个答案:

答案 0 :(得分:116)

上下文

在菜单配置中似乎存在对此showAsAction属性的误解。我在许多stackoverflow答案中找到的信息似乎总是不完整的。所以这是尝试改变它。

三点|溢出|选项菜单

无法控制操作栏是否在代码中显示三点溢出菜单。

你可以通过没有选项菜单来强迫它不显示。公平地说,您可以在How to force use of overflow menu on devices with menu button

处查看更多信息

显示与否的点取决于您正在测试的设备。带有菜单按钮的设备不会显示操作栏上的三个点图标,因为用户可以使用设备上的菜单按钮。

options menu button on device

没有此选项菜单按钮的设备(如从Galaxy开始的nexus设备)无法触发该选项菜单。在这些设备上运行相同的应用程序将在操作栏中显示三点溢出菜单选项。

actionbar showing options menu

你可以控制什么

菜单xml文件中有showAsAction选项,您可以使用控制单个菜单选项在操作栏中的显示方式

根据官方menu resource doc,选项是:

android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

ifRoom 标记仅在有足够空间时显示该选项。在大多数情况下,这应该是您的首选。然而,这将在操作栏中压缩标题(请参阅垂直方向的屏幕截图)。

never 标志将始终在溢出菜单中使用此选项,并且永远不会直接在操作栏中。

不鼓励使用 always 标志,因为它会强制该选项始终显示在acitonbar中。即使在非常小的屏幕尺寸上运行。这可能会使标题完全不可见。

正如您现在可能的选项菜单可以包含android:titleandroid:icon属性。您可以将 withText 标记与alwaysifRoom一起使用(在其间使用管道|)以强制项目的文本在动作栏中呈现时显示在图标旁边。

collapseActionView支持 API level 14 ,所以让我忽略这一点。

屏幕截图,显示在纵向模式下设备上的以下代码段:

collapsed title and mostly icons on vertical orientation

另一个屏幕截图,由于横向模式,操作栏中有更多空间:

landscape mode actionbar rendered

Android文档

关于此操作栏的最佳开发文档是the actionbar guide。如果您查看更多for design guidelines follow this link。之前列出了menu resource link。对于menus in general check this

代码段

该代码仅供参考,因为该部分似乎在大多数答案中都是正确的。可以在https://github.com/AndroidExamples/fragment-navigation

找到更完整的示例

/res/menu/main.xml文件内容:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="be.hcpl.android.example.MainActivity" >

<!-- an option that never appears as a fixed text/icon in the actionbar -->
<item android:id="@+id/action_one"
    android:title="@string/action_one"
    android:orderInCategory="100"
    app:showAsAction="never" />

<!-- another option that only appears if there is enough room -->
<item android:id="@+id/action_two"
    android:title="@string/action_two"
    android:orderInCategory="200"
    app:showAsAction="ifRoom" />

<!-- a last option that always appears -->
<item android:id="@+id/action_three"
    android:title="@string/action_three"
    android:orderInCategory="300"
    app:showAsAction="always" />

<!-- an option to show with both icon and text -->
<item android:id="@+id/action_four"
    android:icon="@android:drawable/ic_menu_directions"
    android:title="@string/action_four"
    android:orderInCategory="400"
    app:showAsAction="withText|always" />

<!-- an option to always show as an icon only -->
<item android:id="@+id/action_five"
    android:icon="@android:drawable/ic_menu_info_details"
    android:title="@string/action_five"
    android:orderInCategory="500"
    app:showAsAction="always" />

</menu>

一些相关的答案

答案 1 :(得分:42)

由于您将showAsAction属性设置为never,因此这些菜单项永远不会显示为操作视图。试试这个:

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

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|withText"
        android:title="@string/action_option1"/>
    <item
        android:id="@+id/action_settings34"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|withText"
        android:title="@string/action_option2"/>
    <item
        android:id="@+id/action_settings3"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|withText"
        android:title="@string/action_option3"/>

</menu>

答案 2 :(得分:9)

我想你总是要在右上角显示溢出菜单图标,并希望你的菜单从那里打开。尝试类似下面的内容强制它:

onCreate()内:

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

它将强制App显示溢出菜单。菜单按钮仍然有效,但它会打开右上角的菜单。取自thisHow to force use of overflow menu on devices with menu button回答。这可能是一种“黑客”,但它有效。

修改

基于@gunar的有用评论,我请求不使用此方法。以下是原因

  • 私有字段sHasPermanentMenuKey将来可以重构 版本。您的应用将停止工作。

  • 此外,如果您强制将动作项移动到操作栏,因为您是 习惯了他们,你最终会混淆用于应用程序方式的用户 在他们的设备上运行。具有硬件menu密钥的那些将被用于 从菜单硬件键中显示选项。如果你故意 向他们展示溢出菜单的三个点,可能会让他们感到困惑。

因此,让所有应用程序在这个意义上都是统一的。那些没有menu项目硬件密钥的设备会自动显示这些设备。

答案 3 :(得分:7)

或者您可以创建如下结构:

<?xml version="1.0" encoding="utf-8"?>
<menu >
<item
    android:id="@+id/menu_main"
    android:icon="@drawable/icon_menu"
    android:showAsAction="always"
    android:title="@string/menu_A"
    android:visible="true">
    <menu>
        <item
            android:id="@+id/menu_settings1"
            android:showAsAction="never"
            android:title="@string/menu_A1"/>
        <item
            android:id="@+id/menu_settings2"
            android:showAsAction="never"
            android:title="@string/menu_A2"/>
        <item
            android:id="@+id/menu_settings3"
            android:showAsAction="never"
            android:title="@string/menu_A3"/>
    </menu>
</item>
</menu>

在icon_menu中,您可以使用三个点图标剪贴画创建一个新图标。

答案 4 :(得分:6)

我遇到了同样的问题。我做了上面提到的所有事情。我的问题是我忘记覆盖onCreateoptionMenu(菜单菜单)。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu,menu);
    return super.onCreateOptionsMenu(menu);
}

答案 5 :(得分:3)

添加

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
在onCreate方法中

答案 6 :(得分:2)

在搜索并阅读了大量答案之后,我发现还有一件事你应该注意。

至少这是我的问题,我没有找到任何上述答案。在您的.XML文件上。您的android:showAsAction=不应该是android套件,应该来自app包,如下例所示:

app:showAsAction=

不要忘记导入app包。

答案 7 :(得分:1)

我必须在setHasOptionsMenu(true)onViewCreated中设置onCreate

答案 8 :(得分:0)

您需要在活动的onCreate函数中调用此函数。

RequestWindowFeature (Window.FEATURE_ACTION_BAR);

答案 9 :(得分:0)

以上所有答案都很好地解释了这个问题

但我们可以覆盖此限制并拥有溢出菜单项吗?!!

是的,我们可以破解

"no value specified for 11"

并在onCreate里面调用它

参考:https://stackoverflow.com/a/13098824/4251431

答案 10 :(得分:0)

为showAsAction和actionViewClass

添加这样的自定义命名空间
<menu xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
    android:title="@string/search"
    android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="android.widget.SearchView" />

答案 11 :(得分:0)

对我有用的是更改menu.xml中的属性

<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/gamingactivity_filter" android:showAsAction="ifRoom"   android:icon="@drawable/ic_filter"/> 

这曾经用于Material主题,但不适用于AppCompat主题和活动,因此我更改了menu.xml的方式,并在名称空间““ {{3]下添加了app:showAsAction=属性}}“

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
  <item android:id="@+id/gamingactivity_filter" android:showAsAction="ifRoom"  app:showAsAction="ifRoom" android:icon="@drawable/ic_filter"/>

从活动膨胀菜单通过OnCreateOptionsMenu(IMenu menu) 现在从OnOptionsItemSelected(),我还可以将选定的项目ID作为

 public override bool OnOptionsItemSelected(IMenuItem item)
        {
                switch (item.ItemId)
                {
                    case Resource.Id.gamingactivity_filter:
                        OnBackPressed();
                        break;
                }
            }
            return true;
        }