Android:调用onCreateOptionsMenu,但未在片段中更新操作栏菜单

Android: onCreateOptionsMenu is called but actionbar menu isn't updated in fragment

我正在使用带有多个片段的drawerlayout。通过单击导航项,我以这种方式切换片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
switch (index) {
            case 0:
                if (checkinFragment == null) {
                    checkinFragment = new CheckinFragment();
                    ft.add(R.id.main_container, checkinFragment,"0");
                } else {
                    ft.show(checkinFragment);
                }

                break;
            case 3:
                if (jianGuanFragment == null) {
                    jianGuanFragment = new JianGuanFragment();
                    ft.add(R.id.main_container, jianGuanFragment,"3");
                } else {
                    ft.show(jianGuanFragment);
                }

                break;
        }

        ft.commitAllowingStateLoss();

每个片段的onCreateOptionsMenu(Menu menu, MenuInflater inflater)方法都有一个不同的菜单资源文件。

步骤:
1.首次进入活动时,显示checkinFragment中的菜单。(所有)
2.然后切换到jianGuanFragment,显示jianGuanFragment中的菜单。
3.但是,当切换回第一个片段(checkinFragment)时,动作栏菜单不会更新。显示的菜单仍然是jianGuanFragment中的菜单。那就是问题所在。

从日志中,我知道每次切换到该片段时都会调用该片段中的onCreateOptionsMenu。就是说:

onCreateOptionsMenu被调用,但操作栏菜单未更新。

有人可以帮助我吗?非常感谢。

编辑1:在onCreateOptionsMenu中添加代码:
(1)在checkinFragment

1
2
3
4
5
6
7
8
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);

        LogUtils.e("TAG","CheckinFragment onCreateOptionsMenu");
        menu.clear();
        inflater.inflate(R.menu.menu_setting, menu);
    }

jianGuanFragment中的

(2)

1
2
3
4
5
6
7
8
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);

        LogUtils.e("TAG","JianGuanFragment onCreateOptionsMenu");
        menu.clear();
        inflater.inflate(R.menu.menu_jianguan, menu);
    }

编辑2:我使用工具栏,而不是旧的操作栏。


最后我找到了解决方法:

每次输入片段时,再次将工具栏重新设置为ationbar。

1
2
3
4
5
6
7
8
9
10
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);

    if (!hidden) {
        AppCompatActivity compatActivity = (AppCompatActivity) mActivity;
        mToolbar = (Toolbar) compatActivity.findViewById(toolbarId);
        compatActivity.setSupportActionBar(mToolbar);
    }
}

尝试一下
1)在checkinFragment

1
2
3
4
5
6
7
 @Override
    public void onPrepareOptionsMenu(Menu menu) {
        menu.clear();
        LogUtils.e("TAG","CheckinFragment onCreateOptionsMenu");
        getActivity().getMenuInflater().inflate(R.menu.menu_setting, menu);
        super.onPrepareOptionsMenu(menu);
   }

使用invalidateOptionsMenu()。您需要在需要调用OnCreateOptionsMenu()的地方使用它。

编辑:
如果要从Fragment调用它,可以使用getActivity().invalidateOptionsMenu()

希望有帮助!!!!