旋转时复制 ActionBar 按钮

Duplicate ActionBar Buttons on Rotation

我试图找到有关此问题的答案,但没有成功。我有一个 片段 ,它有一个名为 'menu_roi_result_calc' 的菜单项。每次屏幕旋转时,都会创建一个新的菜单项。代码如下:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_roi_result_calc, menu);
    return true;
}

然而,经过几次屏幕旋转后,我得到的是:

我觉得这是因为菜单项在每次轮换时都会重新创建,因此每次轮换时都会添加一个新项目。我怎样才能让它停止?如何检查该项目是否存在并防止再次重新创建它?任何代码示例将不胜感激。

作为解决方法,您可以清除菜单,然后再次对其进行充气,调用 clear

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.clear();
    getMenuInflater().inflate(R.menu.menu_roi_result_calc, menu);
    return true;
}

它从菜单中删除所有条目,使其保持刚创建时的状态

您必须先清除菜单对象,然后才能添加项目。我遇到了同样的问题,这是我找到的最佳解决方案。

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

当您旋转应用程序时,您的 activity 将被销毁并创建一个新应用程序。如果您将片段附加到创建它的 activity ,那么它将附加旧片段并附加新片段。为了避免这种情况,我会做类似下面的事情。这将删除所有当前片段并托管您的片段。 FragmentManager fm = new FragmentManager(); for(Fragment aFrag : fm.getFragments()) { fm.beginTransaction().remove(aFrag).commit(); } fragment = createFragment(new Fragment()); fm.beginTransaction().add(R.id.YouGetThePicture, fragment).commit();

我发现了问题所在。我没有重复使用原始标记的片段。我所要做的就是确保检查 savedInstanceState 并检查是否已经创建了标记的片段......如果是这样,请重复使用相同的片段而不是创建新的片段。