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

ric*_*ick 33 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>
Run Code Online (Sandbox Code Playgroud)

活动:

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

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

在此输入图像描述

Pat*_*ick 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>
Run Code Online (Sandbox Code Playgroud)

动作栏的扩展Android指南涵盖了这些新的和讨厌的陷阱......

  • 非常感谢.我几小时前从这篇文章中解决了这个问题.http://stackoverflow.com/questions/18386642/couldnt-show-items-with-appcompat-library你的答案也解释了同样的问题.我错过了showAsAction的yourapp名称空间.相反,我保持安卓: (2认同)

小智 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();
}
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

您可以采用线性布局,给出与操作栏看起来相同的背景,并放置您想要放置的任何图标,并使用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>
Run Code Online (Sandbox Code Playgroud)