2013-04-10 48 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> 
相關問題