菜单项目不显示在操作栏上

我做了一个全新的项目。 我已经将项目添加到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> 

由于您将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> 

上下文

这个showAsAction属性在菜单configuration中似乎有一个误解。 我在许多stackoverflow答案中find的信息总是似乎不完整。 所以这里是试图改变这一点。

三点| 溢出| 选项菜单

如果您的操作栏显示三点溢出菜单或不在代码中,则无法控制。

那么你可以强迫它不显示没有选项菜单肯定。 为了公平起见,你可以在这个菜单上find更多的信息, 如何强制使用菜单button的设备上的溢出菜单

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

设备上的选项菜单按钮

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

显示选项菜单的操作栏

你可以控制什么

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

根据官方菜单资源文件的选项是:

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

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

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

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

正如你现在可能选项菜单可以有一个android:titleandroid:icon属性。 您可以将withText标志与alwaysifRoom (使用ifRoom一个pipe道)一起使用,以强制项目的文本在操作栏中呈现时显示在图标旁边。

collapseActionView只支持从API level 14所以让我忽略这一点。

以纵向模式显示下面的代码片段的屏幕截图:

折叠标题,大多是垂直方向的图标

还有另一个截图,其中的横向模式有更多的空间,

景观模式操作栏呈现

Android文档

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

代码片段

代码仅供参考,因为该部分在大多数答案中似乎是正确的。 在https://github.com/AndroidExamples/fragment-navigation上可以find更完整的示例;

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

一些链接的答案

  • 操作button不显示在操作栏上?
  • 操作栏不显示与AppCompat
  • Android – 想在ICS上显示3点菜单

我想你总想在右上angular显示溢出菜单图标,并希望你的菜单从那里打开。 试试像下面这样强制它:

在你的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 } 

它会强制应用程序显示溢出菜单。 菜单button仍然有效,但会打开右上angular的菜单。 从如何强制使用带菜单button的设备上的溢出菜单中回答这个问题。 这可能是一种“黑客”,但它的作品。

编辑:

基于@ gunar的有用评论,我请求不要使用这个方法。 以下是原因

  • 私有字段sHasPermanentMenuKey可以在未来版本中重构。 那么你的应用将停止工作。

  • 此外,如果您强制将操作项目移动到操作栏,因为您习惯了这些操作项目,则最终会使用户习惯于如何在设备上运行应用程序。 那些带有硬件menu键的将被用来从菜单硬键上显示选项。 如果你有意向他们展示溢出菜单的三个点,可能会混淆他们。

所以让所有的应用程序在这个意义上统一。 那些menu项没有硬键的设备会自动显示这些设备。

或者你可以创build一个像这样的结构:

 <?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你可以创build一个新的图标设置三点图标剪贴画。

经过search和阅读了很多答案之后,我发现还有一件小事你应该注意。

至less这是我的问题,我没有find任何上述的答案。 在您的.XML文件上。 你的android:showAsAction=不应该是表单android包,它应该是从app包如下面的例子:

 app:showAsAction= 

不要忘记导入app包。

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

在onCreate方法中。

上面的所有答案都很好的解释

但我们可以覆盖这个限制,并有溢出菜单项?

是的,我们可以入侵

  private void makeActionOverflowMenuShown() { //devices with hardware menu button (eg 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

你需要在activity的onCreate函数中调用这个函数。

 RequestWindowFeature (Window.FEATURE_ACTION_BAR); 

添加像这样的自定义名称空间到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" />