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

我想通过onCreateOptionsMenu方法从菜单xml文件中添加菜单项后立即更改菜单项的可见性。该代码似乎可以正常工作,但是没有可见的效果。我解决了用onCreateOptionsMenu方法扩大菜单的问题,但更改了onPrepareOptionsMenu方法中菜单的可见性。

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

我在onPrepareOptionsMenu中不能做什么?

这里有什么模式可循吗?

谢谢!

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

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中所做的更改。

10-08 18:00