116

我正在使用从 Android 4.3(API 级别 18)开始可用的新 v7 appcompat 库。

无论在 showAsAction 中为菜单项指定了什么,它都不会显示 - 它总是创建溢出菜单图标,甚至将单个菜单项放在菜单下。

尝试将菜单添加到这样的活动:

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

这是我的菜单xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

是新支持库 v7 的错误,还是代码有问题?我之前多次使用 ActionBarSherlock 的类似代码。

4

13 回答 13

314

可能您缺少必需的命名空间:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:[yourapp]="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

替换[yourapp]为您的应用程序名称或您心中想要的任何名称空间。

其他值得检查的事情:

  • 查看您的活动课程是否扩展ActionBarActivity

检查问题是否仍然存在。


Android 参考文档:添加操作按钮。以下是相关文字:

如果您的应用使用支持库以兼容低至 Android 2.1 的版本,则 showAsAction 属性在 android: 命名空间中不可用。相反,此属性由支持库提供,您必须定义自己的 XML 命名空间并将该命名空间用作属性前缀。(自定义 XML 命名空间应基于您的应用名称,但它可以是您想要的任何名称,并且只能在您声明它的文件范围内访问。)

于 2013-07-28T23:33:44.387 回答
52

我自己想通了。使用支持库 v7,showAsAction 应该在一个自定义命名空间下,如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:balloonberry="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        balloonberry:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>
于 2013-07-28T23:43:14.857 回答
34

还要确保在 ActionBarActivity.onCreateOptionsMenu() 方法中使用正确的充气机。

正确解决方案:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

不正确的解决方案:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);
于 2013-11-21T11:27:02.980 回答
26

对于片段

具有自定义命名空间的菜单将阻止showAsAction 显示。

为 showAsAction 使用“android:”前缀将起作用,即使 Android Studio 会说您应该使用自定义名称空间。

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_add_checkin"
          android:title="Add Checkin"
          android:orderInCategory="10"
          android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add"/>
</menu>

这是使用 Android SDK 22 和支持 v4 片段,以防万一。

于 2015-10-07T16:20:11.460 回答
17

遇到了同样的问题,但在 Android 5 上。我有 3 个项目,但操作系统忽略了我的属性“总是”并且只显示了 2 个项目。这是我的解决方案:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}
于 2015-12-18T16:14:00.833 回答
6

还要确保您有正确的命名空间路径。如果它是错误的,它不会给你一个错误信息。

我有

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

代替

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

我只知道它不起作用。不知道我是如何设法忘记路径的 /apk 部分的,但它发生了。没有错误消息,只是一个难以追踪的错误。

于 2013-10-28T19:20:10.003 回答
6

就我而言,我必须从我的应用程序的 build.gradle compile 'com.android.support:appcompat-v7:21.0.3' 中删除。

注意:我的 min sdk = 14,由 android studio 创建的项目插入了我不必要的依赖。

替换后你可以写 android:showAsAction="always"

于 2015-04-24T10:36:13.080 回答
4

这可能不是你的情况,但我正在使用

new MenuInflater(this).inflate(R.menu.my_menu, menu);

将其更改为

getMenuInflater().inflate(R.menu.my_menu, menu);

解决了问题!

于 2017-06-16T06:23:51.770 回答
0
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >
    <item
        android:id="@id/back"
        android:icon="@drawable/back"
        app:showAsAction="always"
        android:title="@string/back"/>
    <item
        android:id="@id/save"
        android:icon="@drawable/le_top_btn_icon_add"
        app:showAsAction="ifRoom"
        android:title="@string/save"/>
</menu>

不工作,supportLibraryVersion = '25.1.0' compileSdkVersion = 25

见“警告”

应将 app:showAsAction 与带有 xmlns:app="http://schemas.android.com/apk/res-auto" 的 appcompat 库一起使用... (Ctrl+F1)

使用 appcompat 库时,菜单资源应引用 app: 命名空间中的 showAsAction,而不是 android: 命名空间。

同样,当不使用 appcompat 库时,您应该使用 android:showAsAction 属性。

我认为警告可以忽略。

于 2017-04-07T07:50:43.820 回答
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:17:26.983 回答
0

我已经通过更换解决了

android:showAsAction="ifRoom"

app:showAsAction="ifRoom"

那就是menuitme xml 的样子,

<item android:id="@+id/action_refresh"
      android:title="Refresh"
      android:icon="@drawable/refresh2"
      app:showAsAction="ifRoom" />
于 2018-12-01T11:40:32.383 回答
0

最简单的方法是通过添加修改代码

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

并更改此代码

android:showAsAction="always"

app:showAsAction="always"

最后

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        app:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>
于 2019-01-09T21:17:37.423 回答
0

除了@petrnohejl 的回答之外,在Kotlin 中,您可以只使用这一行而无需先对其进行初始化。

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.options_menu, menu)
        return true
    }

就我而言,菜单项只是忽略了我的应用程序:showAsAction="always" 或 "ifRoom",它真的让我烦恼了好几个小时。然后,在 StackOverflow 中搜索后,我意识到我没有使用正确的 MenuInflater。

于 2022-03-05T04:42:45.500 回答