【问题标题】:Menu items doesn't show up on the actionbar [duplicate]菜单项未显示在操作栏上[重复]
【发布时间】:2015-05-13 15:16:31
【问题描述】:

我在我的应用程序中使用 appcompat。我希望菜单项显示在操作栏上,或者至少在没有空间时显示溢出(3 个点)。操作栏上有很多空间,但它们仍然没有出现。菜单流从底部上升,并且只有在按下菜单按钮时才会上升。

menu_activity.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/menu_lang"
        android:showAsAction="always"
        android:title="@string/menu_lang"
        android:icon="@android:drawable/ic_input_lang"/>

</menu>

活动:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_activity, menu);
        return true;
    }

这个post 表示当硬件菜单按钮存在时它不起作用。但其他应用程序能够在同一设备上显示项目。所以,这个答案似乎是不正确的。有人可以帮忙吗?

【问题讨论】:

  • 所以基本上你想在点击硬件菜单按钮时打开操作栏菜单(如果存在)\?
  • 向我们展示您的整个菜单 xml
  • @prateek 不。我希望项目显示在操作栏上,如上图所示。如您所见,右侧搜索和添加有两个选项。所以,我希望它们在操作栏上可见。但只有在按下菜单按钮时,它们才会从屏幕下方显示出来。
  • @M.Bennett 这是我的整个 menu.xml。我只有选择。所以我希望它显示在操作栏上。
  • @M.Bennett 我试过了。没用:/

标签: android android-actionbar-compat


【解决方案1】:

您似乎使用了错误的菜单: 您的文件被命名为“menu_activity.xml”,并且您使用 Resource-Id 来扩充菜单:R.menu.reminder_menu

菜单的资源名称应与文件名相同,即:R.menu.manu_activity

再试一次 - 我也遇到过一次,它把我逼疯了......

更新 在澄清以上部分是为了混淆之后,请确保:

  1. 您扩展了 ActionBarActivity。
  2. 您为活动(或整个应用程序)使用(或扩展)Theme.AppCompat 主题之一
  3. 由于在旧设备上不存在与操作栏相关的属性,因此请确保 XML 中的所有这些属性都与自定义命名空间一起使用。这里是showAsAction 属性,以便兼容性库可以选择它们。

您已经定义了自定义命名空间(“app”,在菜单标签中)。您需要根据Android指南将android:showAsAction标签更改为app:showAsAction

您更正后的 menu_activity.xml 将如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/menu_lang"
        app:showAsAction="always"
        android:title="@string/menu_lang"
        android:icon="@android:drawable/ic_input_lang"/>

</menu>

actionbar 的extended Android guide 涵盖了这些新的讨厌的陷阱...

【讨论】:

  • 我在发布问题以保持匿名时忘记更改名称。但这并不是我问题的真正答案。很抱歉。
  • 没问题。如果您使用 Google 的 AppCompat,还请确保扩展 ActionBarActivity :)
  • 感谢您的回答。我做的。只有当我单击菜单按钮时,我才能找到选项。但不在操作栏上。我想要的是在操作栏上显示项目,如上图所示。
  • 更新了更多信息:特别检查您是否使用了为 showAsAction 属性定义的 app 前缀!
  • 非常感谢。几个小时前我从这篇文章中解决了这个问题。stackoverflow.com/questions/18386642/…你的回答也解释了同样的问题。我错过了 showAsAction 的 yourapp 命名空间。相反,我保留了 android:
【解决方案2】:

好的,我想我找到了适合您的解决方案。它称为溢出菜单,您需要在 onCreate 方法中调用以下方法。

private void getOverflowMenu() {

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) {
   e.printStackTrace();
}
}

试试这个,让我知道它是否适合你。

编辑:

我想我终于理解了你的问题。我可以给你一个想法。如果您不想使用溢出菜单而只显示您发布的屏幕截图中显示的菜单项,您可以在您的活动之上创建一个布局。

您可以采用线性布局,提供与操作栏相同的背景,并在其中放置您想要放置的任何图标,并通过 onClickListener 为它们提供功能。希望这会给你一些想法。这样您就可以创建自己的自定义菜单。试试下面的布局,用菜单图标替换 ic_launcher drawable。然后只需将 onClickListeners 设置为它们并执行您想要在 onClick 方法中执行的任何功能。

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="#66000000" >

    <ImageView
        android:id="@+id/xMenuBtn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:background="@drawable/ic_launcher" />
     <TextView
        android:id="@+id/xMenuTxt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Chats"
        android:textSize="18sp"
        android:layout_toRightOf="@+id/xMenuBtn1"
        android:layout_centerVertical="true" />
    <ImageView
        android:id="@+id/xMenuBtn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/xMenuBtn3"
        android:background="@drawable/ic_launcher" />
    <ImageView
        android:id="@+id/xMenuBtn3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="@drawable/ic_launcher" />

</RelativeLayout>

【讨论】:

  • +1 非常感谢您的回答。它至少显示溢出菜单并且比以前更好。但是为什么菜单项没有出现在操作栏上?因为空间很大。我需要做任何类似的黑客操作才能在操作栏上显示它吗?
  • 好的,你需要那些菜单按钮和溢出菜单吗?或者您只想显示屏幕截图中的所有菜单项?
  • 请检查我回答中的编辑部分,希望您能对如何操作有所了解。
【解决方案3】:

在你的活动中尝试 onCreate() :

ActionBar bar = getSupportActionBar();
bar.setTitle(R.string.app_name);

然后:

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {    
        menu.clear();
        getSupportMenuInflater().inflate(R.menu.menu_activity, menu);
        return super.onPrepareOptionsMenu(menu);
    }

【讨论】:

  • 您能仔细阅读我的问题吗?因为我使用的是 appcompat
  • 支持 v7 包括 v4 我不对吗?这应该有效。顺便说一句,为什么不使用 ABS 呢?
  • 因为我想跟随 google 提供的而不是第三方库。
  • Action Bar Sherlock 基于支持库 v4 和 ActionBar。它无疑是最稳定/便携的库。你肯定不会做得更好(或者这会花你很多时间,有点浪费),有了这个jgilfelt.github.io/android-actionbarstylegenerator/…,你会立即得到一个好看的动作栏;)
  • @Yume117 ActionBarSherlock 现在不再受支持; Jake Warthon(作者)明确表示他将确保它能够正常工作,但不会添加任何新功能。他建议每个人都应该(尽可能)使用 ActionBarCompat(与 Google 发布的相同想法),原因很明显。在撰写此问题时,ActionBarCompat 已经发布,因此 OP 明确表示:“而不是使用第三方库”。
猜你喜欢
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多