メニューオブジェクトを膨らませたい外部onCreateOptionsMenu
メソッド(ユーザーがボタンを押さないときにメニューを作成/表示することを意味する)ので、メニューインスタンスを作成する必要があるinflateメソッドに渡す。
これが私が達成しようとしていることの例です:
_Menu menu = // How to create an instance !?
new MenuInflater(context).inflate(R.menu.my_menu, menu)
_
メニューはインターフェースなので、どのクラスがそれを実装しているかを知る必要があります。 Androidコードを参照して、Menuオブジェクトの作成方法に関するヒントを取得しましたが、探しているものが見つかりませんでした。
編集1
私の目標は、アクティビティによって処理されるカスタムビューからonOptionsItemSelected(MenuItem item)
イベントを発生させることです。そのため、イベントで渡すには特定のitemIdとtitleを持つMenuItemオブジェクトが必要です。
Menuオブジェクトを正常に作成できれば、その子MenuItemを簡単に取得できます。
編集2
私はnotメニューを表示しようとしていますが、私が望むのはListViewに要素で定義されているタイトル、アイコン、およびitemIdを持つメニューXML、ListViewItemがクリックされるたびにonOptionsItemSelected(MenuItem item)
イベントを起動アクティビティで処理されます。
メニューXMLを解析してアイテム情報を抽出できることはわかっていますが、standardMenuItemオブジェクトを作成して渡さなければonOptionsItemSelected(MenuItem item)
を起動することはできません引数として。
任意の助けをいただければ幸いです。ありがとう!
Menuのインスタンスを取得するためのトリックを次に示します。
PopupMenu p = new PopupMenu(getContext(), null);
Menu menu = p.getMenu();
プログラムでMenuインスタンスを作成して膨らませる2つのソリューションを見つけました。
ActionbarSherlock libraryまたは AppCompat v7 libraryMenu menu = new MenuBuilder(context);
を使用するか、独自のMenuBuilder
クラスを記述できます
標準のAndroid SDKを使用:
//リフレクションによるインスタンスの作成
Menu menu = newMenuInstance(context);
protected Menu newMenuInstance(Context context) {
try {
Class<?> menuBuilderClass = Class.forName("com.Android.internal.view.menu.MenuBuilder");
Constructor<?> constructor = menuBuilderClass.getDeclaredConstructor(Context.class);
return (Menu) constructor.newInstance(context);
} catch (Exception e) {e.printStackTrace();}
return null;
}
Menuインスタンスを取得したら、プログラムのメニューXMLリソースanywhereから簡単に展開できます
new MenuInflater(context).inflate(menuId, menu);
私は両方のメソッドをテストし、それらは完全に機能しています。標準のMenu
クラスとMenuItem
クラスでAndroid SDKアクティビティがSherlockActivityを拡張する場合でも、Android.view.MenuItem
またはcom.actionbarsherlock.view.MenuItem
で起動するかどうかに関係なくonOptionsItemSelected(MenuItem item)
を受信するため
独自のメニューを追加するためにインフレータで何かをする必要はありません。単純にonCreateOptionsMenu
をオーバーライドして、独自のitemsをmenオブジェクトに追加し始めます。例えば:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 1, Menu.NONE, "First");
menu.add(0, 2, Menu.NONE, "Second");
// repeat this to add additional menus
return true;
}
addメソッドの2番目の引数はid
です。一意のidsを使用して、選択したメニュー項目を識別します。
Activityで使用されているPhoneWindowに保存されているMenuBuilder(Menuインターフェイスを実装する)のインスタンスをプルできます。私は実用的なソリューションを持っています、それはJava Reflection。
いくつかの重要な隠しメソッド、変数Android platform- http://code.google.com/p/indroid/
BR、プラサンタ