菜单项未显示在操作栏上

pro*_*spk 52 android android-actionbar

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

}
Run Code Online (Sandbox Code Playgroud)

这是我的 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>
Run Code Online (Sandbox Code Playgroud)

hcp*_*cpl 118

上下文

showAsAction在菜单配置中似乎存在对此属性的误解.我在许多stackoverflow答案中找到的信息似乎总是不完整的.所以这是尝试改变它.

三点| 溢出| 选项菜单

没有办法控制你的操作栏是否会在代码中显示三点溢出菜单.

那么你可以通过没有选项菜单来强制它不显示.公平地说,你可以解决这个问题,如何使用菜单按钮强制使用溢出菜单

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

设备上的选项菜单按钮

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

操作栏显示选项菜单

你能控制什么

showAsAction菜单xml文件中有一个选项,可用于控制单个菜单选项在操作栏中的显示方式.

根据官方菜单资源文档,选项是:

android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]
Run Code Online (Sandbox Code Playgroud)

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

never标志将始终在溢出菜单中具有此选项,并且永远不会直接在操作栏中.

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

正如您现在可能的选项菜单可以同时android:title具有android:icon属性和属性.您可以将withText标志与alwaysor 一起使用ifRoom(|在其间使用管道),以便在操作栏中呈现时强制项目文本显示在图标旁边.

collapseActionView只是支持,API level 14所以让我忽略它.

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

折叠标题,主要是垂直方向上的图标

另一个屏幕截图,由于横向模式,操作栏中有更多空间:

横向模式操作栏呈现

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>
Run Code Online (Sandbox Code Playgroud)

一些相关的答案


gun*_*nar 42

由于您将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>
Run Code Online (Sandbox Code Playgroud)

  • 我见过的最好的文章是开发人员的文章.很长时间,所以抓住啤酒并研究它,因为它是您的应用程序导航的关键:http://developer.android.com/guide/topics/ui/actionbar.html (2认同)

Sho*_*uri 9

我想你总是要在右上方显示溢出菜单图标,并希望你的菜单从那里打开.尝试类似下面的内容强制它:

在你的内心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
    }
Run Code Online (Sandbox Code Playgroud)

它将强制App显示溢出菜单.菜单按钮仍然有效,但它会打开右上角的菜单.来自这个在回答如何强制与菜单按钮的设备使用溢出菜单.这可能是一种"黑客",但它有效.

编辑:

基于@gunar的有用评论,我请求不使用此方法.以下是原因:

  • 私有字段sHasPermanentMenuKey可以在将来的版本中重构.您的应用将停止工作.

  • 此外,如果您强制将操作项移动到操作栏,因为您已经习惯了它们,那么您最终会混淆那些用于应用程序如何在其设备上运行的用户.具有硬件menu密钥的那些将用于从菜单硬件密钥显示选项.如果你有意向他们展示溢出菜单的三个点,它可能会混淆它们.

因此,让所有应用程序在这个意义上都是统一的.那些没有menu项目硬件密钥的设备会自动显示这些设备.

  • 您的用户将更多地使用您的设备,而不是使用您的应用.如果你强制将动作项移动到动作栏中,因为你已经习惯了它们,那么你最终会混淆那些习惯于在他们的设备上运行应用程序的用户,因为他们习惯于从菜单中显示选项硬件密钥`:)它有意义吗? (2认同)

Sol*_*aye 9

我有同样的问题.我做了上面提到的所有事情.我的问题是我忘记覆盖onCreateoptionMenu(菜单菜单).

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu,menu);
    return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*had 7

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

<?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>
Run Code Online (Sandbox Code Playgroud)

在icon_menu中,您可以使用三点图标剪贴画创建一个新图标集.


小智 5

添加

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)

在 onCreate 方法中。