Всплывающее меню Xamarin.Android

PopupMenu (также называемое контекстным меню) — это меню, которое привязано к конкретному представлению. В следующем примере одно действие содержит кнопку. Когда пользователь нажимает кнопку, отображается всплывающее меню с тремя элементами:

Example of an app with a button and three-item pop-up menu

Создание всплывающего меню

Первым шагом является создание файла ресурса меню для меню и его размещение в ресурсах или меню. Например, следующий XML-код — это код для меню с тремя элементами, отображаемым на предыдущем снимке экрана: 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>

Затем создайте экземпляр PopupMenu и привязите его к представлению. При создании экземпляра PopupMenuконструктор передает ссылку на Context конструктор, а также представление, к которому будет присоединено меню. В результате всплывающее меню привязано к этому представлению во время его строительства.

В следующем примере PopupMenu создается в обработчике событий нажатия кнопки (который называется showPopupMenu). Эта кнопка также представляет собой представление, к которому PopupMenu привязаны привязки, как показано в следующем примере кода:

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

Наконец, всплывающее меню должно быть раздуваемо с помощью ресурса меню, созданного ранее. В следующем примере добавляется вызов метода Inflate меню и вызывается его метод Show, чтобы отобразить его:

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

Обработка событий меню

Когда пользователь выбирает пункт меню, событие click MenuItemClick будет поднято, и меню будет отклонено. Касание в любом месте за пределами меню просто уволит его. В любом случае при закрытии меню будет возникать его "Закрыть". Следующий код добавляет обработчики событий для MenuItemClick событий и 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 ();
};