onCreateOptionsMenu和onPrepareOptionsMenu不会调用方向更改

在我的片段中,我只想在横向模式下在我的工具栏中显示我的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()initializeLandscapeMenuViews()的视图时会发生崩溃,因为onPrepareOptionsMenu()永远不会被调用。

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

从横向模式开始

  • onCreate
  • onViewCreated
  • onCreateOptionsMenu
  • onPrepareOptionsMenu
  • 然后,方向改变为肖像

  • onCreate
  • onViewCreated
  • 然后,方向改变回风景

  • onCreate
  • onViewCreated
  • onCreateOptionsMenuonPrepareOptionsMenu不会被调用

    我错过了什么? (任何帮助表示赞赏)。


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


    编辑:我认为TS正在开展活动,但他正在使用片段。 抱歉。

    如果您使用的是活动: onCreateOptionsMenuonPrepareOptionsMenu有一个布尔返回值。 所以,你需要返回一个布尔值(而不是void)。 在你目前的方法中,你不会因为这个而重写函数。 这就是为什么看起来这些功能从未被调用。 有关更多信息,请参阅API。

    链接地址: http://www.djcxy.com/p/65367.html

    上一篇: onCreateOptionsMenu and onPrepareOptionsMenu not called on orientation change

    下一篇: AsyncTaskLoader not initialized after screen rotation