android - 在 Fragment 中使用 onPrepareOptionsMenu 而不是 onCreateOptionsMenu

标签 android android-fragments events menu android-menu

我在 ActionBar 中设置一些 fragment 菜单项时遇到了问题,我找到了解决它的方法,但我不明白为什么它会起作用。

我想在 onCreateOptionsMenu 方法中从菜单 xml 文件中扩充菜单项后立即更改它的可见性。该代码似乎工作正常,但没有明显的效果。我解决了在 onCreateOptionsMenu 方法中膨胀菜单但在 onPrepareOptionsMenu 方法中更改它的可见性的问题。

我想知道的是,为什么在 onCreateOptionsMenu 中更改可见性不起作用。

我在 onPrepareOptionsMenu 中可以做什么而在 onCreateOptionsMenu 中不能做什么?

这里有什么可遵循的模式吗?

谢谢!

以下是相关代码,以防万一:

public class MyFragment extends Fragment {

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.my_menu, menu);

        // This does not work, compiles and runs fine, but has no visible effect
        MenuItem someMenuItem = menu.findItem(R.id.some_menu_item);
        someMenuItem.setVisible(false);
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        // This does work
        MenuItem someMenuItem = menu.findItem(R.id.some_menu_item);
        someMenuItem.setVisible(false);
    }
}

最佳答案

您应该在创建菜单之后调用 super.onCreateOptionsMenu(menu, inflater);,而不是之前。这会在层次结构和其他 fragment 中向上发送菜单,或者 Activity 可能想要自己添加项目。

Activity 负责显示和管理菜单,因此如果在将菜单发送到 Activity 后更改可见性,则不会发生什么。

现在,当您调用 super.onPrepareOptionsMenu(menu); 时,它将“准备”它的菜单,但它现在将采用您在 onCreateOptionsMenu 中所做的更改> 考虑在内。

关于android - 在 Fragment 中使用 onPrepareOptionsMenu 而不是 onCreateOptionsMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11375981/

相关文章:

android - 将现有应用程序转换为使用选项卡

java - Android Fragment 看起来很开销

excel - 如何在 SelectionChange 之前触发 EXCEL 事件 BeforeDoubleClick?

c# - 使 lambda 事件订阅者只触发一次然后将其删除

javascript - 请解释 nextTick 文档中的示例

php - 电话可以用来传播本地主机的使用吗?

android - 以编程方式移动照片后如何更新图库?

android - fragment 内带有 SupportMapFragment 的 NullPointerException

java - 使用字符串在文本文件中保存联系人时出现问题

c# - 应用内购买时出现 android.app.Service 连接泄漏错误