从后台启动应用程序时重复上下文菜单图标

时间:2015-08-26 14:46:11

标签: android-fragments android-activity contextmenu

我正在测试我的应用程序"不要保持活动"开发者选项的选项。当我尝试对应用程序进行后台处理并启动它时,我会在操作栏中添加多个重复图标。enter image description here

我正在添加片段中的上下文菜单图标。我有一个字符串传递给片段的字符串。当我启动并启动应用程序时,Android会尝试重新创建活动,并且在此过程中会多次调用 setHasOptionsMenu(true); ,并向操作栏添加重复的图标。

以下修复此问题,但想知道这是否是最佳方法

if(savedInstanceState == null) {
   setHasOptionsMenu(true);
}

1 个答案:

答案 0 :(得分:1)

也许我回答你的问题有点迟了,但对未来的用户来说可能会有用。

问题根源

当您启动应用程序并启动它时,系统将保存并恢复您的片段状态。此外,还会调用onCreate()方法并将新片段添加到您的“活动”中,最终会在您的活动中运行多个片段,每个片段都会在菜单中添加一个项目。

解决方案

(+)正确修复:在添加片段之前,只需在onCreate()方法中添加空检查(以避免重复)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        if (savedInstanceState == null) {
            Fragment fragment = ...
            getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.fragment_container, fragment)
                .commit();
        }
    }

(+)或 workaround1 :清除片段中的menu onCreateOptionsMenu()内部方法

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

(+)或 workaround2 :仅当您在OP中提到的setHasOptionsMenu(true)时调用savedInstanceState == null