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

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

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

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

@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类似的代码。

可能你缺less必需的命名空间:

 <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]replace为您的应用程序名称或任何您想要的名称空间。

其他值得检查的事情:

  • 看看你的活动类是否扩展了ActionBarActivity

检查问题是否仍然存在。


Android参考文档: 添加动作button 。 这里是相关的文字:

如果您的应用程序正在使用支持库来实现与Android 2.1一样低的版本兼容性,那么showAsAction属性将无法从android:命名空间中使用。 相反,该属性由支持库提供,您必须定义自己的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> 

对于片段

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

使用“android:”前缀showAsAction将工作,即使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片段,以防万一。

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

正确的解决scheme:

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

错误的解决scheme:

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

有同样的问题,但在Android 5.我有3项,但操作系统忽略了我的属性“总是”,只显示2项。 这里我的解决scheme

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

在我的情况下,我不得不从我的应用程序的build.gradle编译“com.android.support:appcompat-v7:21.0.3”。

注意 :我的min sdk = 14,并且由android studio创build的项目插入了我的非唯一依赖。

在这个replace之后,你可以编写android:showAsAction =“always”

还要确保你有正确的名字空间的path。 如果错误,它不会给你一个错误信息。

我有

 <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部分的path,但它发生了。 没有错误信息,只是一个难以捉摸的错误追踪。

有同样的问题。

我有

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/searchRunner" android:icon="@drawable/ic_home_black" android:title="Search" android="ifRoom"/></menu> 

代替

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/item1" android:title="Options"/> <item android:id="@+id/searchRunner" android:icon="@drawable/ic_home_black" android:title="Search" app:showAsAction="ifRoom"/></menu> 
 <?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与appcompat库与xmlns:app =“http://schemas.android.com/apk/res-auto”less…(Ctrl + F1)

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

同样,当不使用appcompat库时,您应该使用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" />