Xamarin.Android コンテキストメニュー
1 コンテキストメニュー
コンテキストメニューは、Windowsでは右クリックで表示されますが、Androidでは、長押しで表示されるようになっています。
オプションメニューはユーザーに対して、その画面(アクティビティ)全体に対して他にできることを提示するのに対し、
コンテキストメニューというのは、その長押し部分(リストの1行など)に対するメニューというイメージで使用されます。
2 RegisterForContextMenuとOnCreateContextMenu
コンテキストメニューの実装も、非常にシンプルで、OnCreateContextMenu()をオーバーライドしてリソースを設定し、RegisterForContextMenu()で、呼び出し元のビューを指定するだけです。
protected override void OnCreate(Bundle bundle){ base.OnCreate(bundle); SetContentView(Resource.Layout.Main); //ListViewのオブジェクト取得 var listView = FindViewById<ListView>(Resource.Id.listView1); //ListViewにデータをセットする var ar = new List<String>(); for (var i = 0; i < 50; i++){ ar.Add(string.Format("Title_{0}", i)); } listView.Adapter = new ArrayAdapter<String>(this,Android.Resource.Layout.SimpleListItem1,ar.ToArray()); //ListViewにコンテキストメニューを設定する RegisterForContextMenu(listView); }
public override void OnCreateContextMenu(IContextMenu menu, View v, IContextMenuContextMenuInfo menuInfo){ if (v.Id == Resource.Id.listView1){ //コンテキストメニューの呼び出し元を確認する MenuInflater.Inflate(Resource.Menu.ContextMenu, menu); //リソース指定 } }
3 OnMenuItemSelected
コンテキストメニューが選択された時の処理は、OnContextItemSelected()をオーバーライドして記述します。パラメータとして受け取る「IMenuItem item」が、選択されたアイテムです。
なお、item.MenuInfoから、このコンテキストメニューを呼び出したビューの情報も取得可能です。
下記の例では、ListViewのポジションを取得しています。
public override bool OnContextItemSelected(IMenuItem item){ //コンテキストメニューの呼び出し元(ListView)の情報を取得する var info = (AdapterView.AdapterContextMenuInfo)item.MenuInfo; Toast.MakeText(this, string.Format("position:{0}\nid:{1}\ntitle:{2}" , info.Position //長押しされたListViewのポジション , item.ItemId //選択されたコンテキストメニューのID , item.TitleFormatted) //選択されたコンテキストメニューのタイトル ,ToastLength.Short).Show(); return true; }
4 動的生成
例によって、コンテキストメニュー用のリソースを動的に生成するコードも残しておきます。xmlで指定した最初の例と違って、メニューにタイトル「選択メニュー」が表示されていますが、これは、SetHeaderTitle()で指定しています。
※このタイトルの指定は、xmlでは、どうやって指定するのか分かりませんでした。
public override void OnCreateContextMenu(IContextMenu menu, View v, IContextMenuContextMenuInfo menuInfo){ if (v.Id == Resource.Id.listView1){ //コンテキストメニューの呼び出し元を確認する menu.SetHeaderTitle("選択メニュー");//メニュータイトル menu.Add(Menu.None, 0, 0,"メニュー1"); menu.Add(Menu.None, 1, 1, "メニュー2"); menu.Add(Menu.None, 2, 2, "メニュー3"); } }