菜单装入器(MenuInflater)的工作原理是什么?

8
如果我理解正确,MenuInflater是一种可以填充(展开、扩展?)菜单类型对象的对象。 但是这个方法什么时候被调用,哪个菜单对象会自动传入? getMenuInflater()是做什么用的(还是它只是另一种方式的... = new MenuInflater())? 然后一旦填充对象被创建,.inflate到底做了什么? 传入的菜单对象如何处理我的main.xml菜单?
(如果我一次问太多问题,我很抱歉。)
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(Menu);
}

1
请阅读http://developer.android.com/guide/topics/ui/menus.html。 - Antoine Marques
当然我之前已经读过了,但是它只是关于Java部分的说明:“要为一个活动指定选项菜单,请覆盖onCreateOptionsMenu()方法(片段提供自己的onCreateOptionsMenu()回调)。在这个方法中,您可以将您的菜单资源(在XML中定义)填充到回调中提供的菜单中。例如:”,然后是一个类似于我上面给出的示例。 - PenguinCake
2个回答

15
一个 MenuInflater 是一个能够从xml资源中创建Menu(仅限于菜单资源),也就是说:根据菜单资源标识符构造一个新的Menu实例。
当设备的菜单按钮被按下或者调用Activity.openOptionsMenu()时,onCreateOptionMenu(Menu)方法会被调用。
菜单的实际渲染由Activity处理。在它显示之前,Activity会将菜单传递给你,以便你填充它自己的项,然后显示它。
因此,Android认为既然渲染菜单不是你的工作,你也不应该控制在onCreateOptionsMenu中实际传递给你的菜单。
至于ActionBaronCreateOptionsMenu在填充ActionBar时被调用,以使来自菜单的选项在ActionBar中可用。此方法仅在创建Activity后调用一次。如果您想修改菜单,请改为覆盖Activity.onPrepareOptionsMenu

1
你所说的菜单按钮是指动作栏右侧的三个点,对吗? - PenguinCake
1
这就是它:在某些设备上,菜单按钮可能不是物理按钮,因此操作栏包括一个溢出按钮,显示选项菜单。 - Antoine Marques
1
好的,那么(如果我错了,请纠正我):我按下溢出按钮(一种菜单对象),它调用onCreateOptionsMenu并将自身作为参数传递。然后创建一个MenuInflater,它会将main.xml填充到溢出菜单中。最后返回一些必要的超级数据以使菜单实际起作用。 - PenguinCake
1
实际行为是:按照所说按下按钮。这个按钮不是一个“菜单”,只是一个按钮。如果已经创建,Activity会被通知并调用onCreateOptionsMenu,然后是onPrepareOptionsMenu。这两个函数都接收ActivityMenuInflater(请参见Activity.getMenuInflater)和由活动传递的Menu对象(其创建不包含在API中)。 - Antoine Marques
1
然后,如果需要,您填充“Menu”膨胀的XML资源,然后该方法返回。然后,该“Activity”获取您传递给它并填充的“Menu”,并显示它(API未涵盖如何显示)。 - Antoine Marques
1
哦,好的,我明白了。是啊,API为什么不涵盖这个有点奇怪,我肯定不是唯一一个想知道这个如何工作的新开发人员...谢谢 :) - PenguinCake

6
我的理解是,“inflating” 是指“读取”资源文件(一个描述布局或GUI元素的XML文件),并且“创建”相应的对象;这将使菜单对象在Android应用程序中可见。 MenuInflater类代表了一个Android框架类,专门解析和构建来自菜单资源文件的菜单。
请查看:使用Java和XML在Android上构建菜单:介绍 从这篇文章中可以了解到:

一旦菜单资源文件(my_menu.xml)准备好并具有您想要添加的所有项目,您就可以使用MenuInflater覆盖函数onCreateOptionsMenu。 此函数应使用所需的菜单项填充菜单对象,但Android的MenuInflater类可帮助您从上述XML资源创建菜单项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接