Android 4.3菜单项showAsAction ="always"被忽略

Mci*_*gwe 113 android menuitem android-support-library android-actionbar-compat

我正在使用从Android 4.3(API级别18)开始提供的新v7 appcompat库.

无论showAsAction中为菜单项指定了什么,它都没有显示 - 它总是创建溢出菜单图标,甚至在菜单下放置一个菜单项.

试图将菜单添加到这样的活动:

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

这是我的菜单xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>
Run Code Online (Sandbox Code Playgroud)

它是新支持库v7的错误,还是代码有问题?我以前多次使用与ActionBarSherlock类似的代码.

Nik*_*ski 309

您可能缺少必需的命名空间:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:[yourapp]="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>
Run Code Online (Sandbox Code Playgroud)

替换[yourapp]为您的应用程序名称或您心所欲望的任何命名空间.

其他值得检查的事情:

  • 查看您的活动类是否扩展 ActionBarActivity

检查问题是否仍然存在.


Android参考文档:添加动作按钮.以下是相关文字:

如果您的应用程序使用支持库以获得与Android 2.1一样低的版本的兼容性,则android:namespace中不提供showAsAction属性.相反,此属性由支持库提供,您必须定义自己的XML命名空间并将该命名空间用作属性前缀.(自定义XML命名空间应该基于您的应用程序名称,但它可以是您想要的任何名称,并且只能在您声明它的文件范围内访问.)

  • 每个人都说"自定义命名空间"或"与您的应用匹配的命名空间".但是在每个例子中,命名空间总是`http:// schemas.android.com/apk/res-auto`.这不是自定义的,也不是与您的应用匹配的.这是文档中的实际命名空间.我认为每个人都意味着一个自定义*前缀*,它实际上可以是你想要的任何东西.这是真的? (21认同)
  • @dineth appcompat用作库项目.这意味着它的所有资源(字符串,可绘制,属性......)都在应用程序命名空间而不是android命名空间中声明.由于android-7中不存在`showAsAction`属性,因此必须使用app命名空间 (8认同)
  • 'yourapp'在String.xml中表示<string name ="app_name"> yourapp </ string>对吗? (5认同)
  • 有人可以解释为什么这有效吗?为什么需要扩展自定义命名空间?有点困惑. (4认同)
  • 这也是我发现的.谢谢 - 绝对接受.但是showAsAction应该使用该自定义命名空间. (2认同)
  • 我是公平的,[yourapp]可以是任何东西.在我的应用程序使用您的建议后,我尝试了以下内容:xmlns:cheese ="http://schemas.android.com/apk/res-auto"在顶部,然后在我使用的项目中:奶酪:showAsAction = "总是".所以......除非在我的项目中以某种方式定义奶酪(事实并非如此),否则只要你保持一致就没关系,只要你保持一致:-D (2认同)

Mci*_*gwe 52

弄清楚自己.使用支持库v7,showAsAction应该在这样的自定义命名空间下:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:balloonberry="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        balloonberry:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>
Run Code Online (Sandbox Code Playgroud)

  • @LOG_TAG - 不,它应该如上面输入的那样.这不是字符串,而是命名空间. (5认同)

pet*_*ejl 31

还要确保在ActionBarActivity.onCreateOptionsMenu()方法中使用正确的inflater.

正确的解决方案:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);
Run Code Online (Sandbox Code Playgroud)

解决方案不正确:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);
Run Code Online (Sandbox Code Playgroud)


Bak*_*ker 24

对于碎片

具有自定义命名空间的菜单将阻止 showAsAction显示.

使用showAsAction的"android:"前缀将起作用,即使Android Studio会注意到您应该使用自定义名称空间.

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_add_checkin"
          android:title="Add Checkin"
          android:orderInCategory="10"
          android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add"/>
</menu>
Run Code Online (Sandbox Code Playgroud)

这是使用Android SDK 22和支持v4片段,以防万一.

  • 您可以使用工具来抑制XML布局中的错误/警告:<item>中的ignore ="AppCompatResource".文档:http://tools.android.com/tips/lint/suppressing-lint-warnings (3认同)

Luk*_*kas 16

有同样的问题,但在Android 5.我有3项,但操作系统忽略我的属性"总是",只显示2项.我的解决方案:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}
Run Code Online (Sandbox Code Playgroud)


Bec*_*caP 6

还要确保您具有命名空间的正确路径.如果错误,它不会给你一个错误信息.

我有

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:myapp="http://schemas.android.com/res-auto">
Run Code Online (Sandbox Code Playgroud)

代替

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:myapp="http://schemas.android.com/apk/res-auto">
Run Code Online (Sandbox Code Playgroud)

我所知道的只是它没有用.不知道我是如何设法忘记路径的/ apk部分,但它发生了.没有错误消息,只是一个难以捉摸的错误追踪.


Ant*_*ema 6

在我的情况下,我不得不从我的应用程序的build.gradle编译'com.android.support:appcompat-v7:21.0.3'中删除.

注意:我的min sdk = 14,由android studio创建的项目插入了我不必要的依赖.

在这个替换之后你可以写android:showAsAction ="always"