showAsAction="ifRoom" doesn't show the item even when there is plenty of room
I am trying to get the ActionBar working properly on my app (and I'm using ActionBarSherlock to get a unified UI between Android 2.x and 4.x).
I feel like android:showAsAction="ifRoom"
is just a big, fat lie. Whenever I set an action to ifRoom
it ALWAYS shows up in the overflow menu even if there is PLENTY of room. Here are two screenshots from the same emulator. The first shows the ActionBar with all options set to always
and the second shows the ActionBar with the last two options set to ifRoom
. As you can see, there was PLENTY of room when they were all shown in the always
screenshot, so why aren't they all showing in the second because they DO have room?
Here is my 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>
I hope I am not too late in coming to the party.
It is really not a big fat lie but a small oversight.
The showAsAction
attribute must be defined using a different namespace "http://schemas.android.com/apk/res-auto"
You should therefore in your top menu tag define a namespace as follows
xmlns:app="http://schemas.android.com/apk/res-auto"
and then use that to define your showAsAction attribute like so
app:showAsAction="ifRoom"
That should fix it
It's because there is specified maximum number of items that should go to actionbar and it seems to be 4. Of course you can force them to appear by setting showAsAction: always
but regarding to google API guides:
If you believe that more than four of your menu items can be justified as action items, then you should carefully consider their relative level of importance and try to set no more than four as action items (and do so using the "ifRoom" value to allow the system to put some back in the overflow menu when space is limited on smaller screens). Even if space is available on a wide screen, you should not create a long stream of action items that clutter the UI and appear like a desktop toolbar, so keep the number of action items to a minimum.
Additionally, the following actions should never appear as action items: Settings, Help, Feedback, or similar. Always keep them in the overflow menu.
To complement the answer from Michal Z.: The Android Design Guide Page Patterns->Actionbar says the following in the chapter "Action Buttons":
http://developer.android.com/design/patterns/actionbar.html
How many actions will fit in the main action bar? Action bar capacity is controlled by the following rules:
- Action buttons in the main action bar may not occupy more than 50% of the bar's width.
- Action buttons on bottom action bars can use the entire width.
- The screen width in density-independent pixels (dp) determine the number of items that will fit in the main action bar:
- smaller than 360 dp = 2 icons
- 360-499 dp = 3 icons
- 500-599 dp = 4 icons
- 600 dp and larger = 5 icons
use app:showAsAction="always"
instead of android:showAsAction="always"
Use
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" >