Xamarin.Android PopUp Menu

PopupMenu (también denominado menú contextual) es un menú que está anclado a una vista determinada. En el ejemplo siguiente, una sola actividad contiene un botón, y cuando el usuario lo pulsa, se muestra un menú emergente de tres elementos:

Ejemplo de una aplicación con un botón y un menú emergente de tres elementos

Creación de un elemento emergente

El primer paso es crear un archivo de recursos de menú para el menú y colocarlo en Resources/menu. Por ejemplo, el siguiente XML es el código del menú de tres elementos que se ha mostrado en la captura de pantalla anterior, Resources/menu/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/item1"
          android:title="item 2" />
    <item android:id="@+id/item1"
          android:title="item 3" />
</menu>

A continuación, cree una instancia de PopupMenu y ánclela a su vista. Al crear una instancia de PopupMenu, pasa a su constructor una referencia a Context, así como la vista a la que se asociará el menú. Como resultado, el menú emergente se ancla a esta vista durante su construcción.

En el ejemplo siguiente, se crea PopupMenu en el controlador de eventos Click para el botón (que se denomina showPopupMenu). Este botón es también la vista a la que está anclado PopupMenu, como se muestra en el siguiente ejemplo de código:

showPopupMenu.Click += (s, arg) => {
    PopupMenu menu = new PopupMenu (this, showPopupMenu);
};

Por último, el menú emergente debe inflarse con el recurso de menú que se creó anteriormente. En el ejemplo siguiente, se agrega la llamada al método Inflate del menú y se llama a su método Show para mostrarlo:

showPopupMenu.Click += (s, arg) => {
    PopupMenu menu = new PopupMenu (this, showPopupMenu);
    menu.Inflate (Resource.Menu.popup_menu);
    menu.Show ();
};

Control de eventos de menú

Cuando el usuario selecciona un elemento de menú, se generará el evento Click MenuItemClick y se descartará el menú. Pulsar en cualquier lugar fuera del menú simplemente lo descartará. En cualquier caso, cuando el menú se descarte, se generará su elemento DismissEvent. El siguiente código agrega controladores de eventos para los eventos MenuItemClick y DismissEvent:

showPopupMenu.Click += (s, arg) => {
    PopupMenu menu = new PopupMenu (this, showPopupMenu);
    menu.Inflate (Resource.Menu.popup_menu);

    menu.MenuItemClick += (s1, arg1) => {
        Console.WriteLine ("{0} selected", arg1.Item.TitleFormatted);
    };

    menu.DismissEvent += (s2, arg2) => {
        Console.WriteLine ("menu dismissed");
    };
    menu.Show ();
};