devstory

Le Tutoriel de Android PopupMenu

  1. Android Popup Menu
  2. Exemple de Popup Menu

1. Android Popup Menu

Sous Android, Popup Menu est un menu flottant (floating menu), vous pouvez le créer et l'ancrer (anchor) dans n'importe quelle View. En termes d'interface et d'utilisation, il n'est pas différent d'un Context Menu.
Vous pouvez utiliser le Android Resource File (XML) pour concevoir l'interface d'un PopupMenu. Cependant, PopupMenu d'une application est généralement assez simple, donc la création d'un PopupMenu entièrement à partir de code Java est également un bon choix (voir plus dans l'exemple ci-dessous).
Remarque: Certains attributs de <item> (Menu Item) ne fonctionnent pas lorsqu'il est placé dans un Popup Menu, par exemple:
  • app:showAsAction
  • android:icon (Not work in Android 3.0+/API 11+)

2. Exemple de Popup Menu

Sur Android Studio, créez un nouveau projet.
  • File > New > New Project > Empty Activity
    • Name: PopupMenu
    • Package name: org.o7planning.popupmenuexample
    • Language: Java
Remarque: À partir d'Android 3.0 (API 11), PopupMenu ne prend pas en charge les Icon, mais vous pouvez copier les Icon ci-dessous dans le dossier drawable pour prendre en charge les appareils Android plus anciens, ou ignorer cette étape.
icon_upload.png
icon_bookmark.png
icon_share.png
L'interface principale de l'application est très simple, comprenant 2 Button, lorsque l'utilisateur clique sur Button1, un PopupMenu s'affichera et sera ancré (anchor) dans Button2.
activity_main.xml
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Check Me"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="PopupMenu will anchor on me"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button1" />
</androidx.constraintlayout.widget.ConstraintLayout>
Sur Android Studio, sélectionnez:
  • File > New > Android Resource File
  • File name: layout_popup_menu.xml
  • Resource type: Menu
Sur l'interface de conception Android Studio pour le Popup Menu:
Définissez l'ID, Title, Icon des éléments Menu Item:
layout_popup_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuItem_upload"
        android:icon="@drawable/icon_upload"
        android:title="Upload" />
    <item
        android:id="@+id/menuItem_bookmark"
        android:icon="@drawable/icon_bookmark"
        android:title="Bookmark" />
    <item
        android:id="@+id/menuItem_share"
        android:icon="@drawable/icon_share"
        android:title="Share">
        <menu>
            <item
                android:id="@+id/menuItem_facebook"
                android:title="Facebook" />
            <item
                android:id="@+id/menuItem_instagram"
                android:title="Instagram" />
        </menu>
    </item>
</menu>
MainActivity.java
package org.o7planning.popupmenuexample;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity  {

    public static final String LOG_TAG =  "PopupMenuExample";

    private Button button1;
    private Button button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.button1 = (Button) findViewById(R.id.button1);
        this.button2 = (Button) findViewById(R.id.button2);

        this.button1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                button1Clicked( );
            }
        });
    }

    // User click on the Button 1.
    private void button1Clicked( )  {
        // When user click on the Button 1, create a PopupMenu.
        // And anchor Popup to the Button 2.
        PopupMenu popup = new PopupMenu(this, this.button2);
        popup.inflate(R.menu.layout_popup_menu);

        Menu menu = popup.getMenu();
        // com.android.internal.view.menu.MenuBuilder
        Log.i(LOG_TAG, "Menu class: " + menu.getClass().getName());

        // Register Menu Item Click event.
        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                return menuItemClicked(item);
            }
        });

        // Show the PopupMenu.
        popup.show();
    }

    // When user click on Menu Item.
    // @return true if event was handled.
    private boolean menuItemClicked(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menuItem_bookmark:
                Toast.makeText(this, "Bookmark", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menuItem_upload:
                Toast.makeText(this, "Upload", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menuItem_facebook:
                Toast.makeText(this, "Share Facebook", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menuItem_instagram:
                Toast.makeText(this, "Share Instagram", Toast.LENGTH_SHORT).show();
                break;
            default:
                Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }
}
Vous pouvez également créer un PopupMenu entièrement en utilisant du code Java:
// Create a PopupMenu using Java.
public void createPopupMenu(Context activity, View anchorView ) {
    // Create a PopupMenu and anchor it on a View.
    PopupMenu popupMenu = new PopupMenu(activity, anchorView);

    Menu menu = popupMenu.getMenu();

    // groupId, itemId, order, title
    MenuItem menuItemUpload = menu.add(1, 1, 1, "Upload");
    MenuItem menuItemBookmark = menu.add(2, 2, 2, "Bookmark");
    menuItemUpload.setIcon(R.drawable.icon_upload);
    menuItemBookmark.setIcon(R.drawable.icon_bookmark);

    // groupId, itemId, order, title
    SubMenu subMenuShare=  menu.addSubMenu(3, 3, 3, "Share");
    subMenuShare.setIcon(R.drawable.icon_share);

    subMenuShare.add(4, 31, 1, "Google" );
    subMenuShare.add(5, 32, 2, "Instagram");
}

Tutoriels de programmation Android

Show More