欲膨胀以外的菜单对象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)
,而无需创建一个标准的菜单项的对象把它作为参数。
任何帮助将不胜感激。 谢谢!
这里有一个窍门让菜单的一个实例:
PopupMenu p = new PopupMenu(getContext(), null);
Menu menu = p.getMenu();
我发现了两个解决方案,以编程方式创建一个菜单实例,它充气:
//创建通过反射一个实例
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);
我测试了这两种方法,它们是完美的工作,我会建议使用与标准第二种方法Menu
和MenuItem
,即使你的活动来延长SherlockActivity因为它仍然会收到类从Android SDK中onOptionsItemSelected(MenuItem item)
,如果你用火也不管android.view.MenuItem
或com.actionbarsherlock.view.MenuItem
你不需要为了增加自己的菜单与充气做任何事情。 只需重写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,以确定您选择的菜单项。
你可以拉使用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