2013-04-10 71 views
36

我想让ActionBar在我的应用程序上正常工作(并且我使用ActionBarSherlock在Android 2.x之间获得统一的UI和4.x)。showAsAction =“ifRoom”即使有足够的空间也不显示该项目

我觉得像android:showAsAction="ifRoom"只是一个大,胖的谎言。每当我设置一个动作到ifRoom它总是出现在溢出菜单,即使有足够的空间。以下是来自同一模拟器的两个屏幕截图。第一个显示了所有选项设置为always的ActionBar,第二个显示了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> 

回答

11

这是因为没有指定应该去动作条项目的最大数量,这似乎是4。当然你可以通过设置showAsAction: always来强制它们出现,但关于谷歌API指南:

如果您认为四个以上的菜单项可以合理 作为行动项目,那么你应该仔细考虑它们的相对 水平的重要性,并尝试设置不超过四成行动项目 (并因此使用“ifRoom”值允许系统在空间限制在较小的屏幕时将某些 放回溢出菜单)。 即使在宽屏幕上有空间可用,也不应创建长时间的操作项目,这些操作项目会使用户界面杂乱无章,并且显示为 桌面工具栏,因此应尽量减少操作项目的数量。

此外,以下操作不应出现在操作 项目中:设置,帮助,反馈或类似内容。始终将它们保存在 溢出菜单中。

+13

这并不总是4.见以下图表:http://developer.android.com/ design/media/action_bar_pattern_table.png –

+4

但是,正如你所看到的那样,这些行动还有空间,所以-ifRoom-是一个大胖子的谎言。 :)这也令人沮丧,没有可见的指标,有更多的选项可通过菜单按钮。向他们展示一些选项,但并非没有指示器,情况会更糟糕,因为展示SOME会告诉用户这是需要查看的位置。为什么会有另一个位置? –

+1

@Jake Wharton:是的!我知道我以前看过类似的东西,但我不记得在哪里。现在我认为这是在关于ActionBar的动作视频的谷歌设计之一...谢谢! –

7

,以补充米哈尔ž:答案 Android的设计指南Patterns->动作条说,章在下面的“动作按钮”:

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

多少行动将适合在主要的行动栏?在主操作栏

  • 动作按钮可能不占据条的宽度的50%以上:操作栏容量由下面的规则进行控制。
  • 底部动作条上的动作按钮可以使用整个宽度。
  • 在密度独立像素(DP)确定,将适合在主操作栏项的数目的屏幕宽度:
    • 小于360 DP = 2个图标
    • 360-499 DP = 3个图标
    • 500-599 DP = 4项的图标
    • 600 DP和更大= 5个图标
31

我希望我不是来参加聚会,为时已晚。

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

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

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

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

应该修复它

+11

我有完全相同的问题 - 事实上在我的情况 - 我不得不做的完全相反:使用android:showAsAction命名空间来解决这个问题。 – KurtCobain

+4

如果您正在使用'ActionBarActivity',则需要使用命名空间。使用'Activity'你可以使用android:showAsAction – nickromano

+1

我试过了,没有为我工作。 Android文档甚至不支持它。 –

2

U SE

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

请解释您的答案,因为代码只有答案通常不清楚,难以理解。 – SuperBiasedMan

+0

无法正常工作,仍然只显示dont(...)菜单 –

3

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

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> 
相关问题