Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ActionBar compat overflow menu not showing on sdk 10

Hello and thank you for the time you take in reading this question.

I am trying to develop an android app which will use the ActionBar compat library. I have followed (as far as I see it) all the recommendations when using the compat library. My Manifest looks like this(only relevant code shown):

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"        
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application            
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.Light" >

    </application>

</manifest>

As you can see I am targeting sdk 8+. I have used the Theme.AppCompat theme as recommended.

My menu file looks like this:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cds="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_map"
        android:icon="@drawable/ic_action_map"
        android:title="@string/action_map"
        cds:showAsAction="ifRoom"/>
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:title="@string/action_search"
        cds:showAsAction="ifRoom"/>
    <item
        android:id="@+id/action_mail"
        android:icon="@drawable/ic_action_mail"
        android:title="@string/action_mail"
        cds:showAsAction="ifRoom"/>

</menu>

I am using my own namespace for the showAsAction attribute.

My activity extends the ActionBarActivity class.

The problem is this: On sdk 10 (android 2.3.3), both on device and emulator, the overflow menu (the three dots on the right side of the action bar) are not shown. Only the first 2 of the menu items are shown on the action bar. If i press the "Menu" button on the device then the third item is shown from the bottom left corner of the screen (not from the upper right corner as on the devices with more recent android versions). The same code works well on android sdk 17 on emulator (the overflow menu is shown with the proper actions).

I have searched the web for a solution but I could not find one with this specific problem. I would have abandoned the issue if I wouldn't have installed apps on the android 2.3.3 device that have the same action bar and which show the overflow menu icon and work properly like on any recent android device. One example of this app is the todoist app (https://en.todoist.com/android) or the handcent app(https://play.google.com/store/apps/details?id=com.handcent.nextsms&hl=en) which both behave well on this device.

Is there anything I am missing or is there an alternative solution to the recommended way of using the actionbar compat?

Thank you for your time.

like image 668
Andrei Zafiu Avatar asked Dec 01 '13 10:12

Andrei Zafiu


2 Answers

@Andrei Google have disabled the menu overflow button in appcompat on pre honycomb. If You really want to add it go to the android's github repository and download platform_frameworks_support. It contains sorce for appcompat in platform_framework_support_master/v7/appcompat.

Create a libs folder inside appcompat and put latest android-support-v4.jar. Now open file v7/appcompat/src/android/support/v7/internal/view/ActionBarPolicy.java. You will see that showOverflowMenuButton is returned false for pre honycomb.Just return it true and add this edited appcompat as library to your project and you will not need any custom overflow button This worked with me. Sorry for my English

EDIT: actual code from android/support/v7/internal/view/ActionBarPolicy.java

public boolean showsOverflowMenuButton() {
    // Only show overflow on HC+ devices
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
}
like image 58
Mohit Avatar answered Sep 27 '22 22:09

Mohit


Try to show as I did.

I add overflow menu (three dots) manually:

<item
    android:id="@+id/menu_more"
    android:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_light"
    android:title="@string/action_settings"
    myapp:showAsAction="always">
    <menu>
        <item
            android:id="@+id/submenu_about"
            android:showAsAction="always"
            android:title="@string/menu_about"/>
    </menu>
</item>

and override menu button click in activity to show this menu (solution from Opening submenu in action bar on Hardware menu button click):

private Menu mainMenu;    

...

@Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_UP) {
            switch (keyCode) {
            case KeyEvent.KEYCODE_MENU:

                mainMenu.performIdentifierAction(R.id.menu_more, 0);
                return true;
            }

        }
        return super.onKeyUp(keyCode, event);
    }

Result on 2.2 looks like:

Android 2.2 Overflow menu

Hope it helps you.

like image 22
Andy Mac Avatar answered Sep 27 '22 21:09

Andy Mac