onCreateOptionsMenu和onPrepareOptionsMenu未调整方向更改

时间:2016-12-28 00:34:29

标签: android android-fragments menuitem android-menu

在我的片段中,我只想在横向模式下在工具栏中显示我的Menu / MenuItems。当我改变方向时,我注意到onCreateOptionsMenuonPrepareOptionsMenu没有被调用。

换句话说,我的菜单项的横向布局仅在横向模式下开始时有效,但在我尝试更改到横向模式时却无效(崩溃时)从肖像变为风景。)

public class MyFragment extends Fragment
{
    private int orientation;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        orientation = getResources().getConfiguration().orientation;
        if (orientation == Configuration.ORIENTATION_LANDSCAPE)
            setHasOptionsMenu(true);

        super.onCreate(savedInstanceState);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
    {
        if (orientation == Configuration.ORIENTATION_LANDSCAPE)
            inflater.inflate(R.menu.my_menu, menu);

        super.onCreateOptionsMenu(menu, inflater);
    }

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);          
        if (orientation == Configuration.ORIENTATION_PORTRAIT)
            initializePortraitMenuViews(view);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.my_layout, container, false);
    }

// other code not shown
}

当我尝试访问我在initializeLandscapeMenuViews()中初始化的视图时发生崩溃,因为永远不会调用onPrepareOptionsMenu()

我使用调试器检查了调用的顺序:

以横向模式开始

  1. onCreate
  2. onViewCreated
  3. onCreateOptionsMenu
  4. onPrepareOptionsMenu
  5. 然后,方向更改为肖像

    1. onCreate
    2. onViewCreated
    3. 然后,方向改变回景观

      1. onCreate
      2. onViewCreated
      3. onCreateOptionsMenuonPrepareOptionsMenu未被调用

        我错过了什么? (感谢任何帮助。)

2 个答案:

答案 0 :(得分:0)

基本上我没有看到你的方法有任何问题。 不过,你试过调用invalidateOptionsMenu()吗? 它假设通过调用onCreateOptionsMenu()告诉操作系统要重绘菜单。

答案 1 :(得分:-1)

编辑:我认为TS正在处理活动,但他正在使用片段。遗憾。

如果您正在使用该活动:onCreateOptionsMenuonPrepareOptionsMenu具有布尔返回值。所以,你需要返回一个布尔值(而不是void)。在您当前的方法中,您不会因此而覆盖这些函数。这就是为什么它似乎永远不会调用函数。 有关详细信息,请参阅API