showAsAction =“ifRoom”即使有足够的空间也不显示该项目

时间:2013-04-10 05:50:31

标签: android android-layout android-actionbar actionbarsherlock android-menu

我正在尝试让ActionBar在我的应用上正常工作(我正在使用ActionBarSherlock在Android 2.x和4.x之间获得统一的用户界面)。

我觉得android:showAsAction="ifRoom"只是一个大而肥胖的谎言。每当我将动作设置为ifRoom时,即使有足够的空间,它也会一直显示在溢出菜单中。以下是来自同一模拟器的两个屏幕截图。第一个显示ActionBar,所有选项都设置为always,第二个显示ActionBar,最后两个选项设置为ifRoom。正如你所看到的那样,当它们全部显示在always屏幕截图中时,会有很多空间,所以为什么它们都没有在第二个显示,因为它们有空间?

enter image description here

enter image description here

这是我的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>

8 个答案:

答案 0 :(得分:37)

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

这不是一个大胖子,而是一个小小的疏忽。

必须使用不同的命名空间showAsAction

定义"http://schemas.android.com/apk/res-auto"属性

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

然后使用它来定义你的showAsAction属性 app:showAsAction="ifRoom"

那应该解决它

答案 1 :(得分:13)

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

  

如果您认为可以证明超过四个菜单项是合理的   作为行动项目,那么你应该仔细考虑他们的亲戚   重要程度,并尝试设置不超过四个作为行动项目   (并使用“ifRoom”值来允许系统放置一些   当在较小的屏幕上限制空间时返回溢出菜单)。   即使在宽屏幕上有空间,也不应该创建一个   长时间的动作项,使UI混乱,看起来像一个   桌面工具栏,因此请将操作项的数量保持在最低限度。

     

此外,以下操作永远不应显示为操作   项目:设置,帮助,反馈或类似。始终保持他们   溢出菜单。

答案 2 :(得分:10)

补充Michal Z的答案: Android设计指南页面模式 - &gt; Actionbar在“操作按钮”一章中说明以下内容:

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

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

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

答案 3 :(得分:4)

使用app:showAsAction="always"代替android:showAsAction="always"

答案 4 :(得分:2)

使用

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" >

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

答案 6 :(得分:0)

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 创建自己的视图。

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

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

相关问题