SIN@SAPPOROWORKSの覚書

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

Xamarin.Android コンテキストメニュー

【 Xamarin 記事一覧 】

1 コンテキストメニュー

ContextMenu001

ContextMenu002

コンテキストメニューは、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 動的生成

ContextMenu004

例によって、コンテキストメニュー用のリソースを動的に生成するコードも残しておきます。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");
    }
}


5 XMLのエラー

ContextMenu003
メニューのリソースを指定したXMLでエラーが発生しています。
動作はしているのですが、どうやって対処していいのか分かりません・・・

【 Xamarin 記事一覧 】