onPrepareOptionsMenu函数是做什么用的?

36

我想为Android制作 Option Menu,我访问了这个网站。在他们的脚本中,我找到了 onPrepareOptionsMenu,我尝试使用Android 2.3.3编译器编译并运行,有和没有 onPrepareOptionsMenu 都可以工作,但我没有看到任何区别。

public boolean onCreateOptionsMenu(Menu menu){
    //code here
}
    
public boolean onOptionsItemSelected(MenuItem item){
    //code here
}
    
public boolean onPrepareOptionsMenu(Menu menu){
    //code here
}

onPrepareOptionsMenu 方法是做什么用的?它是否很重要?我能否删除这个方法?


另外

哦,我也听说过 Android 3.0 中的 Action Bar,据说它是制作选项菜单的替代方法,并且使用了 onPrepareOptionsMenu。这是正确的吗?

谢谢...


请仔细阅读文档,它是为此而创建的。如果您不理解其特定功能,请提出问题。http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu(android.view.Menu) - Alexis C.
@ZouZou:抱歉,我还是 Android 的新手,直到你告诉我,我才知道有文档可用。谢谢。 - Tutompita
1
当用户按下菜单按钮(物理或在操作栏上)时,它被调用。 - IgorGanapolsky
4个回答

50

API 中查看:

准备显示屏幕的标准选项菜单。这将在菜单显示之前的每次显示时调用。您可以使用此方法有效地启用/禁用项目或以其他方式动态修改内容。


1
谢谢! “动态修改内容”这几个词已经把一切都解释清楚了! - Tutompita
@Tutompita 如果这个答案满足了您的需求,您可以将其标记为正确答案。 - Tom Naessens
最好能够通过示例来解释动态修改内容的方法。 - Shubham AgaRwal

8
如果你想在用户看到菜单之前修改它,可以将代码放入 onPrepareOptionsMenu 中。我曾经在某些情况下动态地禁用了一些菜单选项。
举个例子,我有一个应用程序,其中有一种指定目的地的方式。我的其中一个菜单选项是计算到目的地的路线。然而,如果没有指定目的地,那个选项就不适用,所以我使用 onPrepareOptionsMenu 在不适用时禁用了那个菜单选项。
从 Android 3.0 开始,有一个菜单栏叫 ActionBar。最重要的项目放在 ActionBar 自身中,但是当 ActionBar 上的空间不足时,还有一个溢出菜单。可以指定菜单项始终位于溢出菜单中,而不是在 ActionBar 自身中。在某些设备上,ActionBar 的溢出对应设备上的永久菜单按钮,而在其他没有菜单按钮的设备上,溢出菜单显示在 ActionBar 的右侧,是三个垂直点。

1
我举了一个例子。如果这个答案让您满意,您可以将其标记为正确的,并/或标记为有用的。 - Stochastically
当我有足够的声望时,我很乐意为你的答案点赞。 - Tutompita
1
我只使用过Android 4及以上版本,也许你应该问另一个问题。 - Stochastically
1
我的最低Android版本是4.0,所以我只使用ActionBar。我从未在Android中使用过其他类型的选项菜单。请注意,您无法控制是否获得三个垂直点用于溢出菜单,或者溢出菜单是否转到硬件菜单按钮。如果有硬件菜单按钮,则我熟悉的所有Android版本都会自动将其用于ActionBar溢出。 - Stochastically
哦,我明白了,我也读过这个。所以,根据我所读的,ActionBar仅适用于API 11及以上版本,OptionMenu仅适用于API 10及以下版本。 要使API 10及以下版本(如我所见到的带有三个点菜单的应用程序)使用ActionBar,它说我们可以使用ActionBarSherlock,并且要使API 11以上版本使用OptionMenu,我们应该将构建目标提高到API 13。 - Tutompita
显示剩余3条评论

4

当您的活动首次创建时,将调用onCreateOptionsMenu。如果返回false,则不会显示任何选项菜单,并且永远不会调用onPrepareOptionsMenu。

如果onCreateOptionsMenu返回true,则在显示活动之前还会调用onPrepareOptionsMenu,并且每次选项菜单无效时也会调用它。如果需要在创建后启用/禁用、显示/隐藏或添加/删除项目,请使用onPrepareOptionsMenu。

如果您的菜单不更改,请使用onCreateOptionsMenu。


嗨,感谢您的回答,我有一个问题,每次我点击菜单项时,onPrepareOptionsMenu都会被调用(我在那里放了一个日志),它不应该只在活动显示时被调用一次吗?应用程序运行良好,我只是担心这个问题。 - Doilio Matsinhe
1
onCreateOptionsMenu 只会被调用一次。而 Prepare 会被多次调用,这是正常的,只有当您遇到性能问题时才需要关注。 - Steven Spungin

0

例子

@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
    super.onPrepareOptionsMenu(menu);
    if(!URLUtil.isValidUrl(news.geturl())){
        menu.findItem(R.id.share).setVisible(false);
    }
}

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