在Fragment中使用onPrepareOptionsMenu而不是onCreateOptionsMenu

时间:2012-07-07 14:49:56

标签: android android-fragments events menu android-menu

我在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);
    }
}

4 个答案:

答案 0 :(得分:5)

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

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

现在,当你致电super.onPrepareOptionsMenu(menu);时,它会#34;准备"它的菜单,但它现在将考虑您在onCreateOptionsMenu中所做的更改。

答案 1 :(得分:0)

可能是代码应该返回true以使菜单可见,这意味着你应该放 return true;onCreateOptionsMenu()中的onPrepareOptionsMenu()语句。

希望这有帮助。

答案 2 :(得分:0)

我使用onPrepareOptionsMenu来更新菜单上哪些项应该是活动的以及哪些项应该变灰/取消,具体取决于活动的当前状态。使用菜单项的setVisible方法来控制它当前是否显示在菜单上。

答案 3 :(得分:-2)

这对我有用

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);
}
}

试试吧