Android 4.3 menu item showAsAction="always" ignored

83,565

Solution 1

Probably you are missing required namespace:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:[yourapp]="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

Replace [yourapp] with your app name or any namespace your heart desires everywhere.

Other things worth checking:

  • See if your activity class extends ActionBarActivity

Check if the issue persists.


Android reference documentation: Adding Action Buttons. Here is the relevant text:

If your app is using the Support Library for compatibility on versions as low as Android 2.1, the showAsAction attribute is not available from the android: namespace. Instead this attribute is provided by the Support Library and you must define your own XML namespace and use that namespace as the attribute prefix. (A custom XML namespace should be based on your app name, but it can be any name you want and is only accessible within the scope of the file in which you declare it.)

Solution 2

Figured out myself. With the support library v7 the showAsAction should go under a custom namespace like this:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:balloonberry="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        balloonberry:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

Solution 3

Also make sure that you use correct inflater in ActionBarActivity.onCreateOptionsMenu() method.

Correct solution:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

Incorrect solution:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);

Solution 4

For Fragments

Menus with custom namespace will prevent showAsAction from showing.

Using "android:" prefix for showAsAction will work, even though Android Studio will remark you should use a custom name space.

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_add_checkin"
          android:title="Add Checkin"
          android:orderInCategory="10"
          android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add"/>
</menu>

This is using Android SDK 22 and Support v4 fragments, in case that makes any difference.

Solution 5

Got the same problem, but on Android 5. I have 3 items but OS ignored my attribute "always" and showed only 2 items. Here my solution:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}
Share:
83,565

Related videos on Youtube

Mcingwe
Author by

Mcingwe

Updated on March 05, 2022

Comments

  • Mcingwe
    Mcingwe over 2 years

    I'm using the new v7 appcompat library available starting from Android 4.3 (API level 18).

    Regardless of what is specified in showAsAction for a menu item, it's not shown - it always creates the overflow menu icon, and puts even a single menu item under the menu.

    Trying to add menu to an activity like this:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_sizes, menu);
        return true;
    }
    

    And here's my menu xml:

    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/menu_add_size"
            android:title="@string/menu_add_item"
            android:orderInCategory="10"
            android:showAsAction="always"
            android:icon="@android:drawable/ic_menu_add" />
    </menu>
    

    Is it a bug of the new support library v7, or just something wrong with the code? I've been using the similar code with ActionBarSherlock many times before.

    • ChiefTwoPencils
      ChiefTwoPencils almost 11 years
      For informational purposes - "..."always" is not recommended; it is better to use "ifRoom" and let the OS decide."
  • Mcingwe
    Mcingwe almost 11 years
    That's what I've found out as well. Thank you - definitely accepted. But the showAsAction should use that custom namespace.
  • LOG_TAG
    LOG_TAG over 10 years
    'yourapp' means in String.xml <string name="app_name">yourapp</string> right?
  • LOG_TAG
    LOG_TAG over 10 years
    'balloonberry' means in String.xml "<string name="app_name">balloonberry</string>" right?
  • BeccaP
    BeccaP over 10 years
    @LOG_TAG - no, it should just be as entered above. This is not a string, but a namespace.
  • dineth
    dineth over 10 years
    Can someone explain WHY this works? Why is there a need to extend a custom namespace? Little confused.
  • Jared
    Jared over 10 years
    I'm FAIRLY CERTAIN, [yourapp] can be ANYTHING. After I got my app working using your suggestion, I tried the following: xmlns:cheese="schemas.android.com/apk/res-auto" up at the top, and then in the item I used: cheese:showAsAction="always". So... unless cheese is somehow defined in my project (which it isn't), then it doesn't matter what you put, as long as you're consistent :-D
  • nicopico
    nicopico over 10 years
    @dineth appcompat is used as a library project. This means all its resources (strings, drawable, attributes...) are declared in your application namespace instead of the android namespace. As the showAsAction attribute did not exist in android-7, you have to use your app namespace
  • Andrew Arnott
    Andrew Arnott over 10 years
    Everyone says "custom namespace" or "a namespace that matches your app". But the namespace is always http://schemas.android.com/apk/res-auto in every example. That's not a custom one, or one that matches your app. That's the actual namespace from the documentation. I think everyone means a custom prefix, and it can actually be whatever you want. Is this true?
  • user_vgizy
    user_vgizy almost 10 years
    How can I understand my namespace? I don't know how can I learn my namespace
  • Yasitha Waduge
    Yasitha Waduge over 9 years
    ohhh support v7 errr... its ok on support v4
  • uniruddh
    uniruddh over 9 years
    I have did all these, still getting error. Here is my question : stackoverflow.com/questions/27443363/…
  • grandouassou
    grandouassou over 9 years
    Anyone knows how to ensure to display two MenuItem when you create them programmatically? (Using setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)) I need to always display two menu items. The first one is displayed, the second one is collapsed.
  • pinyin_samu
    pinyin_samu almost 9 years
    Thanks it solved me out! This days maybe the best solution in most cases, because it's unnecessary to support Android versions prior to 4.0.
  • user2630165
    user2630165 over 8 years
    That's the only thing that solved My Problem (though it's showing this error). Thanks !
  • Baker
    Baker over 8 years
    You can suppress the error/warning in XML layout with tools:ignore="AppCompatResource" within the <item>. Docs here: tools.android.com/tips/lint/suppressing-lint-warnings
  • Amt87
    Amt87 over 8 years
    I have passed all the above answers and another answers on stackoverflow, but the only thing that I was missing is you answer - getMenuInflater(). Thanks for sharing this.
  • DiscDev
    DiscDev over 8 years
    Thank you SO MUCH for this one. I converted all my 100+ menus to use a custom namespace and 1 stinkin' screen still wasn't working...turns out that 1 activity was using "new MenuInflater" instead of getMenuInflater(). Thanks a ton!
  • hata
    hata about 8 years
    Your answer and Baker's are the right solutions for me.
  • hata
    hata about 8 years
    Your answer and Anton Kizema's are the right solutions for me. And also thanks for the tip tools:ignore.
  • Sachidananda Naik
    Sachidananda Naik almost 8 years
    Thanks for the explanation Mcingwe
  • temirbek
    temirbek almost 8 years
    "If you use ActionBarActivity, you can’t use the Holo or Material themes.." What if I want to use Holo or Material themes?
  • Mr. Bungle
    Mr. Bungle over 7 years
    setShowAsActionFlags() requires API 14, but this was still the best solution for me.
  • Sagar Aghara
    Sagar Aghara about 7 years
    Thanks..you saved my Time...+1 vote for your answer.
  • wtk
    wtk over 6 years
    this is very important. I was using menuInflater creation (2 way). Thanks
  • Yodi S.
    Yodi S. over 2 years
    thanks for this, really helped me. Btw, I have added additional answers for Kotlin users for this solution, you can check it below.