android-菜单项未显示在操作B上

我做了一个全新的项目。 我已将项目添加到main.xml布局文件中。 这些项目不会显示在操作栏的右侧。 我记得有一个带有三个点的图标,它打开了菜单。

enter image description here

这是我的main.xml

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>
prometheuspk asked 2020-01-14T04:29:11Z
11个解决方案
118 votes

语境

菜单配置中的/res/menu/main.xml属性似乎存在误解。 我在许多stackoverflow答案中找到的信息似乎总是不完整。 因此,这是一种尝试来改变这种状况。

三点| 溢出 选项菜单

无法控制您的操作栏是否以代码形式显示三点溢出菜单。

好吧,您可以通过没有选项菜单来强制不显示它。 公平地说,您可以解决这个问题,有关如何通过菜单按钮在设备上强制使用溢出菜单的详细信息

是否显示点取决于您要测试的设备。 具有菜单按钮的设备不会在操作栏上显示三点图标,因为用户可以使用设备上的菜单按钮。

options menu button on device

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

actionbar showing options menu

您可以控制的

菜单xml文件中有/res/menu/main.xml选项,您可以使用该选项来控制单个菜单选项在操作栏中的显示方式。

根据官方菜单资源文档,这些选项为:

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

/res/menu/main.xml标志仅在有足够空间的情况下显示该选项。 在大多数情况下,这应该是您的首选。 但是,这会压缩操作栏中的标题(请参见垂直屏幕截图)。

2701777294988936936192标志始终在溢出菜单中具有此选项,而永远不会直接在操作栏中具有此选项。

不建议使用/res/menu/main.xml标志,因为它会强制将选项始终显示在acitonbar中。 即使在非常小的屏幕尺寸上运行。 这可能使标题完全不可见。

如您现在所见,选项菜单可以同时具有/res/menu/main.xmlandroid:icon属性。 您可以将/res/menu/main.xml标志与alwaysifRoom(在两者之间使用管道|)一起使用,以强制在操作栏中呈现该项目的文本时使其显示在图标旁边。

仅从/res/menu/main.xml支持/res/menu/main.xml,所以让我忽略它。

屏幕截图显示了在纵向模式下保持运行的设备上的以下代码片段:

collapsed title and mostly icons on vertical orientation

还有另一个屏幕截图,由于使用了横向模式,因此在操作栏中有更多空间:

landscape mode actionbar rendered

Android文档

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

程式码片段

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

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

一些链接的答案

  • 动作按钮没有显示在动作栏上?
  • 未随AppCompat一起显示操作栏
  • Android-希望在ICS上显示3点菜单
hcpl answered 2020-01-14T04:31:33Z
42 votes

由于您将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>
gunar answered 2020-01-14T04:29:20Z
9 votes

我认为您想一直在右上方显示溢出菜单图标,并希望从那里打开菜单。 尝试执行以下操作以将其强制执行:

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 ex) {
        // Ignore
    }

它将强制应用程序显示溢出菜单。 菜单按钮仍将起作用,但是它将打开右上角的菜单。 摘自“如何在带有菜单按钮的设备上强制使用溢出菜单”中的答案。 这可能是一种“ hack”,但它可以工作。

编辑:

基于@gunar的有用评论,我要求不要使用此方法。 原因如下:

  • 将来可以重构私有字段menu发布。 然后,您的应用将停止运行。

  • 另外,如果您由于以下原因而将动作项移动到动作栏上,习惯了他们,您将最终使习惯于应用程序的用户感到困惑在他们的设备上运行。 那些具有menu密钥的硬件将用于从菜单硬件键显示选项。 如果您有意向他们显示溢出菜单的三个点,这可能会使他们感到困惑。

因此,从这个意义上讲,让所有应用程序保持一致。 那些没有menu项的硬件密钥的设备将自动显示这些设备。

Shobhit Puri answered 2020-01-14T04:32:26Z
8 votes

我有同样的问题。 我做了上面所说的所有事情。 我的问题是我忘了重写onCreateoptionMenu(Menu menu)。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu,menu);
    return super.onCreateOptionsMenu(menu);
}
Solomon Fissehaye answered 2020-01-14T04:32:46Z
7 votes

或者,您可以创建如下结构:

<?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处,您可以创建带有三点图标剪贴画的新图标集。

Shad answered 2020-01-14T04:33:10Z
3 votes

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

在onCreate方法中。

Aziz Niyazov answered 2020-01-14T04:33:34Z
2 votes

搜索并阅读大量答案后,我发现您还需要注意另一件事。

至少这是我的问题,但我没有找到以上任何答案。 在您的app文件上。 您的android:showAsAction=不应采用android封装,而应采用app封装,如以下示例所示:

app:showAsAction=

不要忘记导入app程序包。

Igor Fridman answered 2020-01-14T04:34:03Z
0 votes

上面的所有答案都很好地解释了这个问题

但是我们可以超越此限制并拥有溢出菜单项吗?!

是的,我们可以破解

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

Basheer AL-MOMANI answered 2020-01-14T04:34:40Z
0 votes

您需要在活动的onCreate函数中调用此函数。

RequestWindowFeature (Window.FEATURE_ACTION_BAR);
faseel answered 2020-01-14T04:35:00Z
0 votes

向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" />
Amirouche Zeggagh answered 2020-01-14T04:35:20Z
0 votes

对我有用的是更改menu.xml中的属性

<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/gamingactivity_filter" android:showAsAction="ifRoom"   android:icon="@drawable/ic_filter"/> 

这曾经在OnCreateOptionsMenu(IMenu menu)主题下工作,但不适用于OnOptionsItemSelected()主题和活动,所以我更改了menu.xml的方式,并在名称空间““下添加了app:showAsAction=属性” [http://schemas.android.com/apk/res-auto”]

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
  <item android:id="@+id/gamingactivity_filter" android:showAsAction="ifRoom"  app:showAsAction="ifRoom" android:icon="@drawable/ic_filter"/>

从活动膨胀菜单通过OnCreateOptionsMenu(IMenu menu)现在从OnOptionsItemSelected()我也可以将选定的项目ID作为

 public override bool OnOptionsItemSelected(IMenuItem item)
        {
                switch (item.ItemId)
                {
                    case Resource.Id.gamingactivity_filter:
                        OnBackPressed();
                        break;
                }
            }
            return true;
        }
Annu answered 2020-01-14T04:35:49Z
translate from https://stackoverflow.com:/questions/18010072/menu-items-are-not-showing-on-action-bar