52

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

在此处输入图像描述

这是我的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>
4

12 回答 12

119

语境

showAsAction菜单配置中似乎对这个属性有误解。我在许多 stackoverflow 答案中找到的信息似乎总是不完整的。因此,这是一个改变这一点的尝试。

三点 | 溢出 | 选项菜单

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

好吧,您可以通过确定没有选项菜单来强制它不显示。公平地说,您可以解决这个问题,更多信息请参阅如何在带有菜单按钮的设备上强制使用溢出菜单

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

设备上的选项菜单按钮

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

显示选项菜单的操作栏

你可以控制什么

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

根据官方菜单资源文档,选项是:

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

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

never标志将始终在溢出菜单中具有此选项,而永远不会直接在操作栏中。

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

正如您现在可能看到的,一个选项菜单可以同时具有一个android:title和一个android:icon属性。您可以将withText标志与alwaysifRoom(在两者之间使用管道|)一起使用以强制项目的文本在操作栏中呈现时显示在图标旁边。

collapseActionView仅支持,所以API level 14让我忽略它。

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

折叠的标题和垂直方向的主要图标

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

呈现横向模式操作栏

安卓文档

关于此操作栏的最佳开发文档将是操作栏指南。如果您正在寻找更多设计指南,请点击此链接。之前列出了菜单资源链接。对于一般菜单检查这个

代码片段

该代码仅供参考,因为该部分在大多数答案中似乎都是正确的。可以在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>

一些链接的答案

于 2014-04-15T09:47:49.927 回答
44

由于您将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>
于 2013-08-02T06:38:00.813 回答
13

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu,menu);
    return super.onCreateOptionsMenu(menu);
}
于 2018-01-04T00:17:12.123 回答
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
    }

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

编辑:

根据@gunar 的有用评论,我要求不要使用这种方法。以下是原因

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

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

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

于 2013-08-02T06:32:18.087 回答
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 中,您可以使用三点图标剪贴画创建新图标集。

于 2014-08-21T19:29:13.917 回答
5

添加

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

在 onCreate 方法中。

于 2017-04-02T07:34:09.383 回答
2

在搜索和阅读了很多答案后,我发现还有一个小事情你应该注意。

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

app:showAsAction=

不要忘记导入app包。

于 2016-07-26T14:15:35.617 回答
1

我必须进入setHasOptionsMenu(true)onViewCreated进入onCreate

于 2020-06-16T20:08:46.760 回答
0

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

RequestWindowFeature (Window.FEATURE_ACTION_BAR);
于 2015-11-15T18:38:35.057 回答
0

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

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

是的,我们可以破解

 private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    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) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

在 onCreate 里面调用它

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

于 2016-05-06T14:43:22.667 回答
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" />
于 2017-09-17T10:46:15.607 回答
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 并app:showAsAction=在命名空间下添加属性“ http://schemas.android.com/apk/res-auto

<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;
        }
于 2018-09-21T09:43:38.433 回答