在Fragment中使用onPrepareOptionsMenu而不是onCreateOptionsMenu

Ger*_*och 7 events android menu android-menu android-fragments

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

我想在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ian 5

您应该super.onCreateOptionsMenu(menu, inflater);在创建菜单之后打电话,而不是之前打电话.这会在层次结构和其他片段中发送菜单,或者活动可能想要自己添加项目.

活动负责显示和管理菜单,因此如果您在将活动发送到活动后更改可见性,则不会发生任何事情.

现在,当你打电话时super.onPrepareOptionsMenu(menu);,它将"准备"它的菜单,但它现在将考虑你所做的改变onCreateOptionsMenu.