web-dev-qa-db-ja.com

プログラムでMenuインスタンスを作成する方法は?つまり、onCreateOptionsMenuの外でメニューを膨張させます

メニューオブジェクトを膨らませたい外部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)を起動することはできません引数として。

任意の助けをいただければ幸いです。ありがとう!

34
iTech

Menuのインスタンスを取得するためのトリックを次に示します。

PopupMenu p  = new PopupMenu(getContext(), null);
Menu menu = p.getMenu();
41
Musma

プログラムで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)を受信するため

28
iTech

独自のメニューを追加するためにインフレータで何かをする必要はありません。単純にonCreateOptionsMenuをオーバーライドして、独自のitemsmenオブジェクトに追加し始めます。例えば:

@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を使用して、選択したメニュー項目を識別します。

2
waqaslam

Activityで使用されているPhoneWindowに保存されているMenuBuilder(Menuインターフェイスを実装する)のインスタンスをプルできます。私は実用的なソリューションを持っています、それはJava Reflection。

いくつかの重要な隠しメソッド、変数Android platform- http://code.google.com/p/indroid/

BR、プラサンタ

0
user542954