閉じる

ダイアログでのコンテキストメニュー

Activityでコンテキストメニューを使うには onCreateContextMenu(…)と onContextItemSelected(…)を実装し、registerForContextMenu(…)を呼べばよい。
しかし、Dialogで同じ事をしてもコンテキストメニューは表示されるものの、項目を選択しても onContextItemSelectedが呼ばれない。
海外の掲示板で「onContextItemSelectedが呼ばれないのなら onCreateContextMenuにて setOnMenuItemClickListenerを使って直接リスナーを登録してしまえ」という案があって実際期待通りに動作するけど、Howling at the Blackmoon: Android Dialogs and onContextItemSelected()にある解決法の方がスマートだな。

1887-0.java
@Override
public boolean onMenuItemSelected(int aFeatureId, MenuItem aMenuItem) {
if (aFeatureId==Window.FEATURE_CONTEXT_MENU){
return onContextItemSelected(aMenuItem);
}else{
return super.onMenuItemSelected(aFeatureId, aMenuItem);
}
}

やっていることはわかるけど、Activityでコンテキストメニューを使う分にはこんなコードは必要ないので、Dialogの実装不備なんだろうか?
froyoのソースを覗いてみた。
なるほど、core/java/android/app/Activity.javaの onMenuItemSelectedでは件のコード相当が記述されているな。onOptionsItemSelectedについてもここでディスパッチしている。
逆に core/java/android/app/Dialog.javaの onMenuItemSelectedは空っぽで falseを返しているだけだわ。
Activity.javaに習って Dialogを継承したクラスの onMenuItemSelectedは以下のような実装に。

1887-1.java
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (featureId) {
case Window.FEATURE_OPTIONS_PANEL:
return onOptionsItemSelected(item);
case Window.FEATURE_CONTEXT_MENU:
return onContextItemSelected(item);
default:
return false;
}
}

onMenuItemSelectedで処理するのが本来なのかも知れないね。

2013/06/02追記

DialogFragmentでも同様の問題に突き当たるのね。
しかし、DialogFragment*1 では onMenuItemSelectedをいじる方法は使えないようだし、直接リスナーを登録する方法しかないかなぁ?
ソースをちょろっと眺めてみた限りでは、ちゃんと呼んでくれそうな感じなんだけど…


*1 support libraryのね。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)