Android10/26/2019

Android Options Menu Tutorial — Toolbar Menu & Overflow Menu in Android

Options Menu in Android is one of the most commonly used UI components for displaying actions inside the app bar or toolbar.

It is commonly used for:

  • Settings
  • Search
  • Share
  • Profile actions
  • Overflow menus
  • Toolbar actions

In this tutorial, we will learn:

  • How Options Menu works
  • How to create menu XML
  • How to show menu items in Toolbar
  • How to create submenus
  • How to handle menu item clicks
  • Modern AndroidX implementation

What Is Options Menu?

Options Menu is the primary collection of menu items for an Android Activity.

It usually appears:

  • Inside Toolbar
  • Inside AppBar
  • Inside Overflow Menu

Common Use Cases

  • Search actions
  • Settings screens
  • Logout button
  • Toolbar actions
  • Navigation shortcuts

Important Modern Android Note

Older tutorials use:


android.support.*

which is deprecated.

Modern Android applications should use:


androidx.*

What We Will Build

In this example:

  • Create Toolbar menu
  • Add icons
  • Create dropdown menu
  • Create submenu
  • Handle click events
  • Show Toast messages

Step 1 — Create activity_main.xml

Create:


res/layout/activity_main.xml

Modern ConstraintLayout Example


<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

    xmlns:android=
    "http://schemas.android.com/apk/res/android"

    xmlns:app=
    "http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Android Options Menu"

        android:textSize="24sp"

        app:layout_constraintTop_toTopOf="parent"

        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintStart_toStartOf="parent"

        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Why Use ConstraintLayout?

ConstraintLayout provides:

  • Better rendering performance
  • Responsive layouts
  • Flat hierarchy
  • Flexible positioning

Step 2 — Create Menu Resource Directory

Inside:


res

Create:


menu

directory.


Step 3 — Create example_menu.xml

Create:


res/menu/example_menu.xml

Modern Menu XML Example


<?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">

    <item

        android:id="@+id/item1"

        android:icon="@drawable/ic_home"

        android:title="Home"

        app:showAsAction="ifRoom"/>

    <item

        android:id="@+id/item2"

        android:title="Settings"

        app:showAsAction="never"/>

    <item

        android:id="@+id/item3"

        android:title="More"

        app:showAsAction="never">

        <menu>

            <item

                android:id="@+id/subitem1"

                android:title="Profile"/>

            <item

                android:id="@+id/subitem2"

                android:title="Logout"/>

        </menu>

    </item>

</menu>

Understanding Menu XML

Menu XML defines:

  • Menu items
  • Icons
  • Submenus
  • Toolbar actions
  • Overflow menu behavior

Understanding showAsAction

Value Description
ifRoom Show in Toolbar if space available
always Always show in Toolbar
never Show inside overflow menu

Step 4 — Create MainActivity.java


package com.example.optionsmenu;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity
        extends AppCompatActivity {

    @Override
    protected void onCreate(
            Bundle savedInstanceState
    ) {

        super.onCreate(
                savedInstanceState
        );

        setContentView(
                R.layout.activity_main
        );
    }

    @Override
    public boolean onCreateOptionsMenu(
            Menu menu
    ) {

        MenuInflater inflater =
                getMenuInflater();

        inflater.inflate(
                R.menu.example_menu,
                menu
        );

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(
            @NonNull MenuItem item
    ) {

        int id = item.getItemId();

        if (id == R.id.item1) {

            Toast.makeText(
                    this,
                    "Home selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            id == R.id.item2
        ) {

            Toast.makeText(
                    this,
                    "Settings selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            id == R.id.subitem1
        ) {

            Toast.makeText(
                    this,
                    "Profile selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            id == R.id.subitem2
        ) {

            Toast.makeText(
                    this,
                    "Logout selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;
        }

        return super
                .onOptionsItemSelected(
                        item
                );
    }
}

How Options Menu Works

  1. Activity starts
  2. Android calls onCreateOptionsMenu()
  3. Menu XML inflated
  4. Toolbar menu displayed
  5. User clicks item
  6. onOptionsItemSelected() executes

What Is onCreateOptionsMenu()?

This method creates Toolbar menu items dynamically.


Example


inflater.inflate(
        R.menu.example_menu,
        menu
);

What Is onOptionsItemSelected()?

This method handles Toolbar item click events.


Toolbar vs ActionBar

ActionBar Toolbar
Older implementation Modern customizable component
Less flexible Highly customizable

Modern Android Recommendation

Modern Android apps should use:

  • Material Toolbar
  • AndroidX AppCompat
  • Navigation Component
  • Material Design 3
  • Jetpack Compose TopAppBar

Modern Material Toolbar Example


<com.google.android.material.appbar.MaterialToolbar

    android:id="@+id/toolbar"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"/>

Jetpack Compose Alternative

Jetpack Compose now uses:


TopAppBar

instead of XML Toolbar menus.


Compose Example


TopAppBar(
    title = {
        Text("Toolbar")
    }
)

Options Menu vs PopupMenu

Options Menu PopupMenu
Toolbar/AppBar menu Anchored floating menu
Global actions Contextual actions

Common Beginner Mistakes

1. Using Deprecated Support Libraries

Always migrate to AndroidX.


2. Forgetting Menu Directory

Menu XML files must be inside:


res/menu

3. Using Too Many Toolbar Icons

Keep Toolbar actions minimal and meaningful.


Best Practices

  • Use MaterialToolbar
  • Use meaningful icons
  • Keep Toolbar uncluttered
  • Use overflow menus wisely
  • Use Navigation Component

FAQ

What is Options Menu in Android?

Options Menu is the primary Toolbar/AppBar menu used for global actions.


Where is Options Menu displayed?

Inside Toolbar or AppBar.


What is the modern alternative?

Jetpack Compose TopAppBar and MaterialToolbar are modern implementations.


Conclusion

Options Menu is an essential Android UI component for displaying application-wide actions and Toolbar interactions.

It improves navigation, accessibility, and overall user experience.

Modern Android applications should combine AndroidX, Material Design 3, responsive layouts, Navigation Component, and scalable architecture for production-grade applications.


About the Author

Salil Jha is a Full Stack and Mobile Developer specializing in Android, React Native, fintech systems, scalable SaaS platforms, and developer tooling products.

CodeChain Dev — Build Modern Products. Solve Real Problems.

Deep Structural Diagnostics.

Mastering JSON is only the first step. Use our industrial-grade workbench to format, validate, and synthesize models for your production APIs.