如何以编程方式创建一个菜单实例? 即外侧膨胀一个菜单onCreateOptionsMenu(Ho

2019-08-05 06:40发布

欲膨胀以外的菜单对象onCreateOptionsMenu方法(这意味着创建/显示当用户没有按下按钮菜单),所以我需要创建一个菜单实例来将它传递给充气方法。

这里是什么,我想实现的例子:

Menu menu = // How to create an instance !? 
new MenuInflater(context).inflate(R.menu.my_menu, menu)

菜单是一个接口,所以我需要知道哪些类实现它。 我也浏览Android的代码来获得一个Menu对象是如何创建的任何暗示,但还是没找到我所期待的。

编辑1

我的目标是能够激发onOptionsItemSelected(MenuItem item)从一个自定义的视图,其将通过活动来处理事件,所以我需要有特定的itemId和标题MenuItem对象与事件传递。

如果我可以成功地创建菜单对象,这将是很容易得到它的孩子们的MenuItems。

编辑2

不是在所有的显示菜单,我想要的是填充有标题,图标和的itemId,每当一个ListViewItem的点击我要 菜单中的XML定义的元素一个ListView onOptionsItemSelected(MenuItem item)事件那是在我的活动处理。

我知道我可以解析XML的菜单来提取物品的信息,但是我不能开火onOptionsItemSelected(MenuItem item) ,而无需创建一个标准的菜单项的对象把它作为参数。

任何帮助将不胜感激。 谢谢!

Answer 1:

这里有一个窍门让菜单的一个实例:

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


Answer 2:

我发现了两个解决方案,以编程方式创建一个菜单实例,它充气:

  • 使用ActionbarSherlock库或程序兼容性V7库 Menu 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;
}

一旦你有一个菜单例如,你可以很容易地从一个菜单XML资源膨胀,它在你的程序的任何地方

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

我测试了这两种方法,它们是完美的工作,我会建议使用与标准第二种方法MenuMenuItem ,即使你的活动来延长SherlockActivity因为它仍然会收到类从Android SDK中onOptionsItemSelected(MenuItem item) ,如果你用火也不管android.view.MenuItemcom.actionbarsherlock.view.MenuItem



Answer 3:

你不需要为了增加自己的菜单与充气做任何事情。 只需重写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;
}

添加方法的第二个参数是id 。 使用唯一的ID,以确定您选择的菜单项。



Answer 4:

你可以拉使用MenuBuilder的实例(它实现菜单界面)存储在PhoneWindow这是在活动中使用。 我有一个工作的解决方案,它使用Java反射。

我已创建了一个项目“InDroid”揭露一些重要的隐藏方法,在Android平台-变量http://code.google.com/p/indroid/

BRI,Frsnt



文章来源: How to create a Menu instance programmatically? i.e. inflate a Menu outside onCreateOptionsMenu