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

时间:2013-08-22 12:12:56

标签: android android-actionbar-compat

我在我的应用中使用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表示当硬件菜单按钮存在时它不起作用。但其他应用程序可以在同一设备上显示项目。所以,这个答案似乎是不正确的。有人可以帮忙吗?

enter image description here

3 个答案:

答案 0 :(得分:71)

您似乎使用了错误的菜单: 您的文件名为“menu_activity.xml”,并使用资源ID标识菜单:R.menu.reminder_menu

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

再试一次 - 我也碰到了这一次它让我疯了......

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

  1. 您扩展了ActionBarActivity。
  2. 您为活动(或整个应用)使用(或扩展)一个Theme.AppCompat主题
  3. 因为在较旧的设备上,不存在与Actionbar相关的属性,请确保XML中的所有这些属性都与自定义命名空间一起使用。这里是showAsAction属性,因此兼容性库可以选择它们。
  4. 您已经定义了自定义命名空间(“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>
    

    动作栏的extended Android guide涵盖了这些新的和讨厌的陷阱......

答案 1 :(得分: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>

答案 2 :(得分: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);
    }