Xamarin.Android ポップアップメニュー
1 PopupMenuクラス
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(); }