33

我在我的应用程序中使用 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;
    }

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

在此处输入图像描述

4

3 回答 3

70

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

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

再试一次 - 我也遇到过一次,这让我发疯了......

更新 澄清以上部分用于混淆后,请确保:

  1. 您扩展 ActionBarActivity。
  2. 您为活动(或整个应用程序)使用(或扩展)Theme.AppCompat 主题之一
  3. 因为在旧设备上,与 Actionbar 相关的属性不存在,所以请确保 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>

用于操作栏的扩展 Android 指南涵盖了这些新的和令人讨厌的陷阱......

于 2013-08-22T12:17:28.573 回答
5

好的,我想我为您找到了解决方案。它称为溢出菜单,您需要在 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>
于 2013-08-22T18:15:29.253 回答
0

在您的活动中尝试 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);
    }
于 2013-08-22T12:23:45.503 回答