Search code examples
androidxmldrop-down-menuandroid-actionbar-compat

ActionBar Compat do not show dropdown menu


I'm using ActionBar Compat in my app and i need to show dropdown menu when user click button in actionbar. In 4.x versions it's ok, but in 2.3 i have something like dialog.

2.3 screenshot

version 2.3

Like i said, in 4.x it's ok:

version 4.0.1

Here is some code:

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

categories.xml

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

    <item
        android:id="@+id/refresh"
        android:icon="@drawable/ic_action_refresh"
        onekr:showAsAction="always"
        android:title="@string/refresh"
        android:visible="true">
    </item>
    <item
        android:id="@+id/dissmiss_page_loading"
        android:icon="@drawable/ic_action_cancel"
        onekr:showAsAction="always"
        android:title="@string/cancel"
        android:visible="false">
    </item>

    <item
        android:id="@+id/categories"
        android:icon="@drawable/ic_action_overflow"
        onekr:showAsAction="always"
        android:title="@string/categories"
        android:visible="true">
        <menu   xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:onekr="http://schemas.android.com/apk/res-auto" >
            <item
                android:id="@+id/city"
                onekr:showAsAction="always"
                android:title="@string/city"
                android:visible="true">
            </item>
            <item
                android:id="@+id/culture"
                onekr:showAsAction="always"
                android:title="@string/culture"
                android:visible="true">
            </item>
        </menu>
    </item>

</menu>

Why does this can be? How this can be fixed? Big thanks to all who respond!


Solution

  • To avoid this, we need use PopupMenu!

    For example:

    action_bar_buttons.xml

       <?xml version="1.0" encoding="utf-8"?>
        <menu   xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:mynamespace="http://schemas.android.com/apk/res-auto" >
    
            <item
                android:id="@+id/some_other_btn"
                android:icon="@drawable/some_other_btn"
                mynamespace:showAsAction="always"
                android:title="@string/some_other_btn"
                android:visible="true">
            </item>
    
            <item
                android:id="@+id/open_drop_down"
                android:icon="@drawable/open_drop_down"
                mynamespace:showAsAction="always"
                android:title="@string/open_drop_down"
                android:visible="true"/>
    
        </menu>
    

    drop_down_menu.xml

    <?xml version="1.0" encoding="utf-8"?>
    <menu   xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:mynamespace="http://schemas.android.com/apk/res-auto" >
    
        <item
            android:id="@+id/item_1"
            android:title="@string/item_1"
            android:visible="true"
            mynamespace:showAsAction="always">
        </item>
        <item
            android:id="@+id/item_2"
            android:title="@string/item_1"
            android:visible="true"
            mynamespace:showAsAction="always">
        </item>
    
    </menu>
    

    in MainActivity.java

    public void showPopup(int itemId){
            View view = findViewById(itemId);
            PopupMenu popupMenu = new PopupMenu(getSupportActionBar().getThemedContext(), view);
            popupMenu.setOnMenuItemClickListener(/* drop_down item click listener */);
            popupMenu.getMenuInflater().inflate(R.menu.drop_down_menu, popupMenu.getMenu());
            popupMenu.show();
        }
    
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
    
        /* . . . */ 
    
        case R.id.open_drop_down:
            showPopup(R.id.open_drop_down);
            break;
    
        /* . . . */ 
    
        default:
            break;
        }
    
        return super.onOptionsItemSelected(item);
    }