Android 4.3 menu item showAsAction="always" ignored

I'm using the new v7 appcompat library available starting from Android 4.3 (API level 18).

Regardless of what is specified in showAsAction for a menu item, it's not shown - it always creates the overflow menu icon, and puts even a single menu item under the menu.

Trying to add menu to an activity like this:

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

And here's my menu 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>

Is it a bug of the new support library v7, or just something wrong with the code? I've been using the similar code with ActionBarSherlock many times before.

83776 次浏览

Probably you are missing required namespace:

<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 reference documentation: 添加操作按钮. Here is the relevant text:

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

使用支持库 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>

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

是的

<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 部分的路径,但它发生了。没有错误消息,只有一个难以捉摸的 bug 需要追踪。

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

正确答案:

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

错误答案:

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

在我的例子中,我必须从应用程序的 build.gradle 编译器中删除‘ com.android.support: appcompat-v7:21.0.3’。

注意 : My min sdk = 14,and create project by android Studio 插入了不必要的依赖关系。

这个替换之后,你就可以写了 ShowAsAction = “ always”

For 碎片

具有自定义名称空间的菜单将显示 防止 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>

这里使用的是 AndroidSDK22和 Supportv4片段,以防有什么不同。

有同样的问题,但是在安卓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);
}
}
<?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>

不管用, 使用 support LibraryVersion =’25.1.0’ CompileSdkVersion = 25

见「警告」

Should use app:showAsAction with the appcompat library with App = “ http://schemas.android.com/apk/res-auto”less... (Ctrl + f 1)

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

Similarly,when not using the appcompat library, 您应该使用 android: showAsAction 属性。

我觉得警告可以忽略。

这可能不是你的案子,但我在用

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

把它改成

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

解决了问题!

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

我已经解决了这个问题

android:showAsAction="ifRoom"

app:showAsAction="ifRoom"

That is 菜单 xml look like,

<item android:id="@+id/action_refresh"
android:title="Refresh"
android:icon="@drawable/refresh2"
app:showAsAction="ifRoom" />

最简单的方法是 Modify your code by adding

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>

In Addition to @petrnohejl 's answer, in Kotlin you can just use this one line without initializing it first.

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

在我的例子中,菜单项只是忽略了我的应用程序: showAsAction = “ always”或“ ifRoom”,它真的让我烦了好几个小时。然后,在 StackOverflow 中搜索之后,我意识到我没有使用正确的 Menuflater。