38

メソッドの外部 でメニューオブジェクトを膨らませたい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とタイトルを持つMenuItemオブジェクトが必要です。

Menuオブジェクトを正常に作成できれば、その子MenuItemsを簡単に取得できます。

編集2

メニューを表示しようとはしていません。必要なのは、タイトル、アイコン、itemIdを持つメニューXMLで定義された要素をListViewに入力することですまた、ListViewItemがクリックされるたびに、自分で処理されるイベントを発生させたいと考えています。アクティビティ。onOptionsItemSelected(MenuItem item)

メニューXMLを解析してアイテム情報を抽出できることは知っていますが、引数として渡すための標準のMenuItemオブジェクトをonOptionsItemSelected(MenuItem item)作成しないと起動できません。

どんな助けでもありがたいです。ありがとう!

4

5 に答える 5

48

Menuのインスタンスを取得するための秘訣は次のとおりです。

PopupMenu p  = new PopupMenu(getContext(), null);
Menu menu = p.getMenu();
于 2014-07-14T04:10:21.997 に答える
29

プログラムでMenuインスタンスを作成し、それを拡張する2つのソリューションを見つけました。

  • ActionbarSherlockライブラリまたはAppCompatv7 ライブラリを使用するか、独自のクラスMenu menu = new MenuBuilder(context);を作成できますMenuBuilder

  • 標準のAndroidSDKを使用する:

//リフレクションによるインスタンスの作成

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リソースから簡単に膨らませることができます。

new MenuInflater(context).inflate(menuId, menu);

私は両方のメソッドをテストしましたが、それらは完全に機能しています。アクティビティがSherlockActivityを拡張している場合でも、 Android SDKの標準Menuとクラスで2番目のメソッドを使用することをお勧めします。これは、またはで起動しても受信するためです。MenuItemonOptionsItemSelected(MenuItem item)android.view.MenuItemcom.actionbarsherlock.view.MenuItem

于 2013-01-04T04:36:55.277 に答える
6

なぜこれがまだ答えではないのかわかりません。これは古い質問ですが、将来の読者のためです。

単にこれを行う場合:

val menu = MenuBuilder(context)
MenuInflater(context).inflate(R.menu.menu_XXXX, menu)

できます!

androidx.appcompat.view.menu.MenuBuilderを実装しandroid.view.Menuます。検査すると、それだけPopupMenuです。

@iTechcom.android.internal.view.menu.MenuBuilderによって言及され、によって使用されることPopupMenuは公開されていないため、使用しないでください。

2つのヘルパー関数と使用例を次に示します。

fun Context.inflateMenu(@MenuRes menuRes: Int): Lazy<MenuBuilder> = lazy {
    MenuBuilder(this)
        .also { MenuInflater(this).inflate(menuRes, it) }
}

fun Fragment.inflateMenu(@MenuRes menuRes: Int): Lazy<MenuBuilder> = lazy {
    MenuBuilder(context)
        .also { MenuInflater(context).inflate(menuRes, it) }
}

使用法:

アクティビティ

class MyActivity : AppCompatActivity(R.layout.activity_my) {

    val menu by inflateMenu(R.menu.menu_my)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ...
    }
}

断片:

class MyFragment : Fragment(R.layout.fragment_my) {

    val menu by inflateMenu(R.menu.menu_my)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        ...
    }
}
于 2019-09-26T21:51:29.833 に答える
2

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

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

于 2013-01-02T08:29:14.300 に答える
0

Activityで使用されているPhoneWindowに格納されているMenuBuilder(Menuインターフェイスを実装)のインスタンスをプルできます。私には実用的なソリューションがあり、JavaReflectionを使用しています。

私はAndroidプラットフォームからのいくつかの重要な隠されたメソッド、変数を公開するために1つのプロジェクト「InDroid」を作成しました-http://code.google.com/p/indroid/

BR、プラサンタ

于 2013-04-07T09:00:58.553 に答える