Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add overflow menu to Toolbar?

I'm trying to use Android ActionBar in my app, and have an option that's hidden away in the overflow menu.

There's a lot of documentation out there, but it's confusing because most of it is only relevant to very old versions of Android, and when you try applying the same concepts, they don't work anymore or work differently.

This is in my Activity layout

<android.support.v7.widget.Toolbar
    android:id="@+id/my_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:titleTextColor="@android:color/white"
    android:background="@color/colorPrimary"
    android:elevation="4dp"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

And this is in my Activity's onCreate() method

// sets up activity toolbar
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);

myToolbar.showOverflowMenu();
myToolbar.setTitleTextColor(R.color.lightPrimaryText);

I've also tried inflating a menu xml file from the onCreateOptionsMenu(), but that also didn't give me the results I wanted.

like image 920
JCLaHoot Avatar asked Sep 11 '16 17:09

JCLaHoot


People also ask

How do I create an overflow menu?

Within the Project tool window, locate the project's app -> res -> menu -> menu_menu_example. xml file and double-click on it to load it into the Layout Editor tool. Switch to Design mode if necessary and select and delete the default Settings menu item added by Android Studio so that the menu currently has no items.

What is overflow menu icon?

The overflow icon is a common UI convention that's leveraged throughout Android to hide settings and other unimportant options. Google is now replacing it in the Play Store with a “tap & hold” gesture and bottom sheet menu.

How do I hide the overflow menu?

Remove your onCreateOptionsMenu() and onOptionsItemSelected() methods, along with the menu resource(s) that they use. Then, the overflow should never show up.


2 Answers

Define a Menu for your Toolbar in the res/menu resource folder, for example:

toolbar_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<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=".activity.MainActivity">

    <item
        android:id="@+id/action_sign_out"
        android:title="@string/toolbar_sign_out"
        app:showAsAction="never"/>
</menu>

Setting app:showAsAction="never" ensures that this MenuItem will not be shown in the Toolbar, but placed in the overflow menu instead.

The theme of your Activity should be (or derive from) one of the NoActionBar themes (Theme.AppCompat.NoActionBar for example, or Theme.MaterialComponents.NoActionBar if you're using Material Components).

In your Activity, set up your Toolbar:

Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);

And override onCreateOptionsMenu() to inflate your previously defined menu resource:

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

You can override onOptionsItemSelected() to define the onClick behaviour of your MenuItem(s):

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_sign_out: {
            // do your sign-out stuff
            break;
        }
        // case blocks for other MenuItems (if any)
    }
    return true;
}
like image 108
earthw0rmjim Avatar answered Oct 06 '22 09:10

earthw0rmjim


in manifest file declare

android:theme="@style/AppTheme.NoActionBar"

like this :

<activity
    android:name=".ActivityName"
    android:label="@string/label"
    android:theme="@style/AppTheme.NoActionBar" />

and add this to your style :

 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

and call this in Activity onCreate() :

toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

override this method in activity:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.product_list, menu);
    //U can find item set icon and stuff...
    MenuItem item= menu.findItem(R.id.action_search);

    return true;
}

and declare your menu like this for overflow menu:

  <?xml version="1.0" encoding="utf-8"?>
<menu >
    <group>
        <item
            android:id="@+id/sign_out"
            android:title="@string/sign_out" />
        <item
            android:id="@+id/about"
            android:title="@string/about" />
    </group>
</menu>

and for handle item selection call this

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) { 
       case R.id.sign_out:
       //do stuff
           break;
           }  
        return super.onOptionsItemSelected(item);
    }

done :)

like image 24
f4rz4m1995 Avatar answered Oct 06 '22 10:10

f4rz4m1995