Xamarin.Android PopUp Menu

O PopupMenu (também chamado de menu de atalho) é um menu ancorado a uma exibição específica. No exemplo a seguir, uma única Atividade contém um botão. Quando o usuário toca no botão, um menu pop-up de três itens é exibido:

Exemplo de um aplicativo com um botão e um menu pop-up de três itens

Criando um menu pop-up

A primeira etapa é criar um arquivo de recurso de menu para o menu e colocá-lo em Recursos/menu. Por exemplo, o seguinte XML é o código para o menu de três itens exibido na captura de tela anterior, Recursos/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>

Em seguida, crie uma instância de PopupMenu e ancorá-la à sua exibição. Ao criar uma instância do PopupMenu, você passa ao construtor uma referência ao Context modo de exibição ao qual o menu será anexado. Como resultado, o menu pop-up é ancorado a essa exibição durante sua construção.

No exemplo a seguir, o PopupMenu é criado no manipulador de eventos click para o botão (que é chamado showPopupMenu). Esse botão também é o modo de exibição ao qual o PopupMenu está ancorado, conforme mostrado no exemplo de código a seguir:

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

Finalmente, o menu pop-up deve ser inflado com o recurso de menu que foi criado anteriormente. No exemplo a seguir, a chamada para o método Inflate do menu é adicionada e seu método Show é chamado para exibi-lo:

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

Manipulando eventos de menu

Quando o usuário seleciona um item de menu, o evento de clique MenuItemClick será gerado e o menu será descartado. Tocar em qualquer lugar fora do menu simplesmente o descartará. Em ambos os casos, quando o cardápio for dispensado, sua demissão será levantada. O código a seguir adiciona manipuladores de eventos para os MenuItemClick eventos e 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 ();
};