Xamarin.Android のポップアップ メニュー

PopupMenu ("ショートカット メニュー" とも呼ばれます) は、特定のビューに固定されているメニューです。 次の例では、1 つのアクティビティにボタンが含まれています。 ユーザーがボタンをタップすると、次に示す 3 項目のポップアップ メニューが表示されます。

ボタンと 3 項目のポップアップ メニューを含むアプリの例

ポップアップ メニューの作成

最初の手順では、メニューのメニュー リソース ファイルを作成し、それを Resources/menu に配置します。 たとえば、次の XML は、前のスクリーンショット に表示された 3 項目メニューのコードである 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 ();
};

メニュー イベントの処理

ユーザーがメニュー項目を選択すると、MenuItemClick クリック イベントが発生し、メニューが閉じます。 メニューの外側の任意の場所をタップすると、単にそれが閉じられます。 どちらの場合も、メニューが閉じると、その DismissEvent が発生します。 次のコードは、MenuItemClickDismissEvent の両方のイベントのイベント ハンドラーを追加します。

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 ();
};