Android10/28/2019

Android PopupMenu Tutorial — Create Modern Popup Menus in Android

PopupMenu in Android is a lightweight floating menu anchored to a specific view.

It is commonly used for:

  • Overflow menus
  • Quick actions
  • Item operations
  • Contextual options
  • Action buttons

In this tutorial, we will learn:

  • What PopupMenu is
  • How to create PopupMenu
  • How to inflate menu XML
  • How to handle item clicks
  • Modern AndroidX implementation
  • Material Design recommendations

What Is PopupMenu?

PopupMenu is a floating menu that appears anchored to a View.

Unlike ContextMenu:

  • PopupMenu appears on click
  • ContextMenu appears on long press

Common PopupMenu Use Cases

  • Toolbar overflow menus
  • RecyclerView item actions
  • Chat message options
  • More options buttons
  • File operations

PopupMenu vs ContextMenu

PopupMenu ContextMenu
Appears on click Appears on long press
Anchored to view Contextual interaction
Quick actions Item-specific operations

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:

  • User clicks button
  • PopupMenu appears
  • User selects menu item
  • Toast message displays

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

    <Button

        android:id="@+id/button_popup"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Show Popup"

        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 performance
  • Responsive layouts
  • Flat hierarchy
  • Flexible positioning

Step 2 — Create Menu XML

Create:


res/menu/popup_menu.xml

popup_menu.xml


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

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

    <item
        android:id="@+id/item1"

        android:title="Item 1"/>

    <item
        android:id="@+id/item2"

        android:title="Item 2"/>

    <item
        android:id="@+id/item3"

        android:title="Item 3"/>

    <item
        android:id="@+id/item4"

        android:title="Item 4"/>

</menu>

Understanding Menu XML

Menu XML files define:

  • Menu items
  • Icons
  • Titles
  • Actions
  • Submenus

Step 3 — Create MainActivity.java


package com.example.popupmenu;

import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

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

public class MainActivity
        extends AppCompatActivity
        implements PopupMenu
        .OnMenuItemClickListener {

    @Override
    protected void onCreate(
            Bundle savedInstanceState
    ) {

        super.onCreate(
                savedInstanceState
        );

        setContentView(
                R.layout.activity_main
        );

        Button button =
                findViewById(
                        R.id.button_popup
                );

        button.setOnClickListener(
                this::showPopup
        );
    }

    public void showPopup(
            View view
    ) {

        PopupMenu popupMenu =
                new PopupMenu(
                        this,
                        view
                );

        popupMenu.setOnMenuItemClickListener(
                this
        );

        popupMenu.inflate(
                R.menu.popup_menu
        );

        popupMenu.show();
    }

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

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

            Toast.makeText(
                    this,
                    "Item 1 clicked",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

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

            Toast.makeText(
                    this,
                    "Item 2 clicked",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            item.getItemId()
            == R.id.item3
        ) {

            Toast.makeText(
                    this,
                    "Item 3 clicked",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            item.getItemId()
            == R.id.item4
        ) {

            Toast.makeText(
                    this,
                    "Item 4 clicked",
                    Toast.LENGTH_SHORT
            ).show();

            return true;
        }

        return false;
    }
}

How PopupMenu Works

  1. User clicks button
  2. PopupMenu object created
  3. Menu XML inflated
  4. Popup menu displayed
  5. User selects item
  6. onMenuItemClick() executes

Understanding PopupMenu Constructor


PopupMenu(
    context,
    anchorView
)

PopupMenu requires:

  • Context
  • Anchor View

What Is inflate()?

The:


inflate()

method loads menu XML into PopupMenu.


Example


popupMenu.inflate(
        R.menu.popup_menu
);

What Is setOnMenuItemClickListener()?

This listener handles menu item click events.


Example


popupMenu
.setOnMenuItemClickListener(
        this
);

Modern Android Recommendations

Modern Android applications commonly use:

  • PopupMenu
  • Material Toolbar menus
  • Bottom Sheets
  • RecyclerView item menus
  • Jetpack Compose DropdownMenu

PopupMenu in RecyclerView

PopupMenus are heavily used inside:

  • Chat applications
  • Social media apps
  • File managers
  • E-commerce product lists

Modern Material Design Menus

Material Design now recommends:

  • Minimal actions
  • Clear icons
  • Bottom sheets for complex actions
  • Responsive menu behavior

Jetpack Compose Alternative

Jetpack Compose now uses:


DropdownMenu

instead of XML PopupMenus.


Compose Example


DropdownMenu(
    expanded = expanded,
    onDismissRequest = {}
)

PopupMenu vs BottomSheet

PopupMenu BottomSheet
Small quick actions Complex actions
Lightweight Large interaction UI
Anchored to view Slides from bottom

Common Beginner Mistakes

1. Using Deprecated Support Libraries

Always use AndroidX libraries.


2. Forgetting Menu XML

PopupMenu requires valid menu resource file.


3. Using Too Many Menu Items

Keep PopupMenu simple and minimal.


Best Practices

  • Use concise menu options
  • Use icons carefully
  • Prefer Material Design styling
  • Keep actions contextual
  • Use BottomSheets for complex flows

FAQ

What is PopupMenu in Android?

PopupMenu is a floating contextual menu anchored to a View.


How do I show PopupMenu?

Create PopupMenu object and call:


popupMenu.show()

What is the modern alternative?

Jetpack Compose DropdownMenu and Material BottomSheets are modern alternatives.


Conclusion

PopupMenu is a simple and efficient Android UI component for displaying quick contextual actions.

It improves user interaction while keeping the UI clean and lightweight.

Modern Android applications should combine AndroidX, Material Design, responsive layouts, and scalable architecture for production-grade user experiences.


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.