50

我试图让 ActionBar 在我的应用程序上正常工作(我正在使用 ActionBarSherlock 在 Android 2.x 和 4.x 之间获得统一的 UI)。

我觉得android:showAsAction="ifRoom"这只是一个又大又胖的谎言。每当我对其设置操作时ifRoom,即使有足够的空间,它也总是显示在溢出菜单中。这是来自同一个模拟器的两个屏幕截图。第一个显示所有选项设置为always的 ActionBar,第二个显示最后两个选项设置为 的 ActionBar ifRoom。如您所见,当它们都显示在always屏幕截图中时,有很多空间,那么为什么它们没有在第二个中显示,因为它们确实有空间?

在此处输入图像描述

在此处输入图像描述

这是我的 menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/add"
        android:icon="@drawable/ic_menu_btn_add"
        android:showAsAction="always"
        android:title="Add"/>
    <item
        android:id="@+id/calculateNPV"
        android:icon="@drawable/menu_icon_npv"
        android:showAsAction="always"
        android:title="NPV"/>
    <item
        android:id="@+id/calculateIRR"
        android:icon="@drawable/menu_icon_irr"
        android:showAsAction="always"
        android:title="IRR/YR"/>
    <item
        android:id="@+id/send"
        android:icon="@android:drawable/ic_menu_share"
        android:showAsAction="always"
        android:title="@string/share_pdf"/>
    <item
        android:id="@+id/graph"
        android:icon="@drawable/ic_menu_gallery"
        android:showAsAction="ifRoom"
        android:title="@string/view_cashflow_diagram"/>
    <item
        android:id="@+id/deleteReorder"
        android:icon="@drawable/ic_menu_clear_playlist"
        android:showAsAction="ifRoom"
        android:title="@string/delete_reorder_cashflows"/>

</menu>
4

8 回答 8

41

我希望我来参加聚会还不算太晚。

这真的不是一个大谎言,而是一个小小的疏忽。

showAsAction必须使用不同的命名空间定义属性"http://schemas.android.com/apk/res-auto"

因此,您应该在顶部菜单标签中定义一个命名空间,如下所示 xmlns:app="http://schemas.android.com/apk/res-auto"

然后用它来定义你的 showAsAction 属性,就像这样 app:showAsAction="ifRoom"

那应该解决它

于 2014-06-02T16:43:45.790 回答
15

这是因为指定了应该转到操作栏的最大项目数,它似乎是 4。当然,您可以通过设置来强制它们出现,showAsAction: always但与 google API 指南有关:

如果您认为超过四个菜单项可以作为操作项,那么您应该仔细考虑它们的相对重要性级别并尝试将不超过四个设置为操作项(并使用“ifRoom”值来当小屏幕上的空间有限时,允许系统将一些内容放回溢出菜单)。即使宽屏幕上有可用空间,您也不应该创建长长的操作项流,这些操作项会使 UI 混乱并看起来像桌面工具栏,因此请将操作项的数量保持在最低限度。

此外,以下操作绝不应显示为操作项:设置、帮助、反馈或类似内容。始终将它们保留在溢出菜单中。

于 2013-04-10T06:03:11.663 回答
11

为了补充 Michal Z. 的答案:Android Design Guide Page Patterns->Actionbar 在“Action Buttons”一章中说:

http://developer.android.com/design/patterns/actionbar.html

主操作栏中可以容纳多少操作?操作栏容量由以下规则控制:

  • 主操作栏中的操作按钮不得超过该栏宽度的 50%
  • 底部操作栏上的操作按钮可以使用整个宽度。
  • 与密度无关的像素 (dp) 中的屏幕宽度决定了适合主操作栏的项目数:
    • 小于 360 dp = 2 个图标
    • 360-499 dp = 3 个图标
    • 500-599 dp = 4 个图标
    • 600 dp 及更大 = 5 个图标
于 2013-12-17T12:50:48.060 回答
6

使用app:showAsAction="always"而不是android:showAsAction="always"

于 2015-09-23T09:48:11.147 回答
1

利用

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
于 2015-06-08T15:29:22.107 回答
1

ActivityBar力求不超过一定数量的可见元素。而且这个限制确实低于ActivityBar可以包含的内容。限制在android.support.v7.view.ActionBarPolicy类中设置:

`/**
     * Returns the maximum number of action buttons that should be permitted within an action
     * bar/action mode. This will be used to determine how many showAsAction="ifRoom" items can fit.
     * "always" items can override this.
     */
    public int getMaxActionButtons() {
        final Resources res = mContext.getResources();
        final int widthDp = ConfigurationHelper.getScreenWidthDp(res);
        final int heightDp = ConfigurationHelper.getScreenHeightDp(res);
        final int smallest = ConfigurationHelper.getSmallestScreenWidthDp(res);

if (smallest > 600 || widthDp > 600 || (widthDp > 960 && heightDp > 720) || (widthDp > 720 && heightDp > 960)) { // For values-w600dp, values-sw600dp and values-xlarge. return 5; } else if (widthDp >= 500 || (widthDp > 640 && heightDp > 480) || (widthDp > 480 && heightDp > 640)) { // For values-w500dp and values-large. return 4; } else if (widthDp >= 360) { // For values-w360dp. return 3; } else { return 2; } }`

如您所见,限制在 2 到 5 之间,这取决于屏幕宽度。

我一直无法找到改变这种行为的方法。所以如果你想超过限制,你应该使用showAsAction="always"或者为ActionBar创建你自己的视图。

于 2018-03-29T08:50:40.050 回答
0

使用下面的代码它将始终有效

<menu 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity">
    <item 
        android:id="@+id/menu_share" 
        android:title="Share"
        android:orderInCategory="100" 
        app:showAsAction="ifRoom"
        android:actionProviderClass="android.widget.ShareActionProvider"/>
</menu>
于 2016-01-14T18:51:54.303 回答
0

实际上,Android 最多会显示 5 个按钮,包括菜单,但您可以根据需要覆盖该行为。

请记住,Material 设计指南是在工具栏上有数量有限的按钮。请记住,即使有空间,某些操作也不应该显示为按钮。

但是,如果您有一些有意义的具体操作,即使您总共有 5 个以上,您也可以展示它们。您只需要自己检查屏幕宽度。

首先,在菜单定义中,将“始终”用于您希望始终显示的最多 4 个按钮。对所有其他人使用“从不”,包括那些您可能以编程方式显示为图标的人。

然后,覆盖 onPrepareOptionsMenu 以添加逻辑以强制将更多操作显示为按钮。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    final Configuration config = getResources().getConfiguration();
    final int width = config.screenWidthDp;

    if (width > 400) {
        MenuItem item = menu.findItem(R.id.your_action);
        item.setShowAsAction(SHOW_AS_ACTION_ALWAYS);

        item = menu.findItem(R.id.another_action);
        item.setShowAsAction(SHOW_AS_ACTION_ALWAYS);
    }

    return super.onPrepareOptionsMenu(menu);
}

当方向改变时,您也可以动态地执行此操作,因为在横向模式下通常有足够的空间,尤其是在平板电脑上。

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        invalidateOptionsMenu();
    }

但不要弄乱工具栏。并记得在小型设备上进行测试。

于 2021-03-26T11:07:09.647 回答