onPrepareOptionsMenu在片段中未被调用。

25
@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater){
    Log.d("Does", "get called");
    inflater.inflate(R.menu.menuItem, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
    
@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    getActivity().invalidateOptionsMenu();
    MenuItem filter = menu.findItem(R.id.section);
    filter.setVisible(false);    
}

我正在尝试在片段中加载我的菜单,它已经被加载了,但是onPrepareOptionsMenu根本没有被调用,而我需要隐藏一些菜单项。
更新:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

我在我的onCreate()方法中调用了setHasOptionsMenu(true)

谢谢,我也遇到了同样的问题,但就像你说的,在片段的onCreate中添加setHasOptionsMenu(true)的调用就解决了它。 - Jase Whatson
5个回答

23

在Android 3.0及以上版本中,当菜单项出现在操作栏中时,选项菜单被认为是始终处于打开状态。当事件发生并且您想要执行菜单更新时,您必须调用invalidateOptionsMenu()方法来请求系统调用onPrepareOptionsMenu()方法。

http://developer.android.com/guide/topics/ui/menus.html

要更改特定项,请使用:menu.findItem(R.id.your_item_id)


15

你需要做两件事情。 步骤1:在Fragment的OnCreateView方法中添加setHasOptionsMenu(true);

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    setHasOptionsMenu(true);
    return inflater.inflate(R.layout.fragment_user_settings, container, false);
}

第二步:在你的Fragment 的 OnViewCreated 方法中添加 getActivity().invalidateOptionsMenu();。或者在主Activity中,当你改变Fragment时添加。


9

可能已经晚了,但我也遇到了同样的问题,解决方案非常简单。 只需从片段中调用getActivity().invalidateOptionsMenu()即可。 这会调用onPrepareOptionsMenu,在这里您可以像这样控制项目的可见性: menu.findItem(R.id.youritem).setVisible(true/false); 希望能有所帮助!


0

这对我有效。

public class ContentFragment extends android.support.v4.app.Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.content_frame,container,false);
        setHasOptionsMenu(true);
        return v;
    }

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

0

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