Android 4.3菜单项showAsAction =“ always”被忽略


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上使用过类似的代码很多次。


2
仅供参考-“ "always"不建议...;最好使用"ifRoom"并让操作系统决定。”
ChiefTwoPencils

Answers:


313

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

<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或更低版本的兼容性,则无法从android:名称空间获得showAsAction属性。相反,此属性由支持库提供,并且您必须定义自己的XML名称空间并将该名称空间用作属性前缀。(自定义XML名称空间应基于您的应用名称,但可以是您想要的任何名称,并且只能在声明它的文件范围内访问。)


2
这也是我发现的。谢谢-绝对可以接受。但是showAsAction应该使用该自定义名称空间。
Mcingwe

5
'yourapp'在String.xml中是什么意思<string name =“ app_name”> yourapp </ string>对吗?
LOG_TAG

4
有人可以解释为什么这样做有效吗?为什么需要扩展自定义名称空间?有点困惑。
dineth,

8
@dineth appcompat用作库项目。这意味着其所有资源(字符串,可绘制属性,属性...)都在应用程序名称空间中声明,而不是在android名称空间中声明。由于该showAsAction属性在android-7中不存在,因此您必须使用应用程序名称空间
nicopico

22
每个人都说“自定义名称空间”或“与您的应用程序匹配的名称空间”。但是命名空间始终存在http://schemas.android.com/apk/res-auto于每个示例中。这不是自定义的,也不是与您的应用匹配的自定义。那是文档中的实际名称空间。我认为每个人都表示一个自定义前缀,它实际上可以是您想要的任何名称。这是真的?
Andrew Arnott 2014年

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>

1
'balloonberry'在String.xml中表示“ <string name =“ app_name”> balloonberry </ string>”对吗?
2013年

5
@LOG_TAG-不,它应该与上面输入的一样。这不是字符串,而是名称空间。
BeccaP

哦,支持v7错误...支持v4很好
Yasitha Waduge 2014年

感谢您的解释Mcingwe
Sachidananda Naik

32

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

正确的解决方案:

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

解决方案不正确:

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

1
我已经通过了以上所有答案以及关于stackoverflow的另一个答案,但是我唯一缺少的是您的答案-getMenuInflater()。感谢您分享。
Amt87,2013年

非常感谢您的帮助。我将我所有的100多个菜单都转换为使用自定义名称空间,并且1个stinkin屏幕仍然不起作用...结果证明1个活动正在使用“ new MenuInflater”而不是getMenuInflater()。万分感谢!
DiscDev

这个非常重要。我正在使用menuInflater创建(2种方式)。谢谢
wtk

24

对于碎片

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

即使Android Studio会备注您使用自定义名称空间,也可以对showAsAction使用“ android:”前缀。

<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和Support v4片段,以防万一。


那是解决“我的问题”的唯一方法(尽管它显示了此错误)。谢谢 !
user2630165

3
您可以使用<item>中的tools:ignore =“ AppCompatResource”抑制XML布局中的错误/警告。此处的文档:tools.android.com/tips/lint/suppressing-lint-warnings
Baker,

您的回答和Anton Kizema的解决方案对我来说是正确的解决方案。也感谢您的提示tools:ignore
hata 2013年

16

遇到相同的问题,但是在Android 5上。我有3个项目,但OS忽略了“总是”属性,仅显示了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);
    }
}

1
setShowAsActionFlags()需要API 14,但这仍然是我的最佳解决方案。
Bungle先生

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部分,但是确实发生了。没有错误消息,只有一个难以捉摸的错误可以跟踪。


6

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

注意:我的最小SDK = 14,并且由android studio创建的项目插入了我不必要的依赖关系。

替换之后,您可以编写android:showAsAction =“ always”


谢谢它解决了我!如今,在大多数情况下,这可能是最好的解决方案,因为不必支持4.0之前的Android版本。
pinyin_samu 2015年

您的回答和贝克的对我来说是正确的解决方案。
hata 2013年

4

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

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

更改为

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

解决了这个问题!


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属性。

我认为该警告可以忽略。


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" />


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" />

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.