読者です 読者をやめる 読者になる 読者になる

SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

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

【 Xamarin 記事一覧 】

1 PopupMenuクラス

001
PopupMenuクラスを使用すると、簡単にポップアップメニューを作成することができますが、このPopupMenは、Android 3(APIレベル11)以降でしか利用できません。
Android3以前では、別にダイアログ等で代用するしかないようです。

なお、Android 3(APIレベル11〜13) とAndroid 4(APIレベル14以降) では、少し書き方が変わっているようです。

2 Android 3による実装

Android3では、MenuInfater の Inflate を使用します。

var button = FindViewById<Button>(Resource.Id.MyButton);
button.Click += (sender, args) =>{
    var menu = new PopupMenu(this, button);
    menu.MenuInflater.Inflate(Resource.Menu.popupMenu, menu.Menu);
    menu.MenuItemClick += (s, a) => {
        Toast.MakeText(this, a.Item.TitleFormatted, ToastLength.Short).Show(); 
    };
    menu.Show();
};


リソースに提示されているpopupMenu.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="Title1" />    
    <item android:id="@+id/item2"
          android:title="Title2" />  
    <item android:id="@+id/item3"
          android:title="Title3" />
</menu>

4 Android 4による実装

Android4では、Inflateを直接コールできます。また、メニュー破棄時のイベントを処理することも可能になっています。

var button = FindViewById<Button>(Resource.Id.MyButton);
button.Click += (sender, args) =>{
    var menu = new PopupMenu(this, button);
    menu.Inflate(Resource.Menu.popupMenu);
    //Android3と同様の記述も可能
    //menu.MenuInflater.Inflate(Resource.Menu.popupMenu, menu.Menu);
    menu.MenuItemClick += (s, a) => {
        Toast.MakeText(this, a.Item.TitleFormatted, ToastLength.Short).Show();
    };
    menu.DismissEvent += (s1, a1) =>{
         //破棄時のイベントも処理できる
    };
    menu.Show();
};


5 PopupMenuをダイナミックに生成する

最後に、表示されるメニューをリソースファイル(xml)からでなく、コード上で生成する方法を記載しておきます。


var button = FindViewById<Button>(Resource.Id.MyButton);
button.Click += (sender, args) =>{
    var menu = new PopupMenu(this, button);
    menu.Menu.Add("Title1");
    menu.Menu.Add("Title2");
    menu.Menu.Add("Title3");
    menu.MenuItemClick += (s, a) => {
        Toast.MakeText(this, a.Item.TitleFormatted,    ToastLength.Short).Show();
    };
    menu.Show();
}

【 Xamarin 記事一覧 】