FragmentStatePageAdapter复制ActionBar菜单项

我有一个FragmentStatePageAdapter(我用作ViewPager的适配器)和操作栏中的菜单项的问题。

当我启动应用程序,一切都很好。 如果我将任务移动到后台(例如,按HOMEbutton),我开始做些事情,直到活动结束,然后当我回到我的应用程序(通过启动器或通知我创build),一切都很好,除了有在操作栏中复制菜单项。

重要的细节是唯一重复的项目是在ViewPager中使用的每个片段的onCreateOptionsMenu()中创build的项目。

如果我用FragmentPageAdapter replaceFragmentStatePageAdapter项目不复制,但片段不显示在ViewPager(getItem()函数从适配器不会被调用,所以它不会返回任何片段)。

有任何想法吗? 一种避免FragmentStatePageAdapter复制菜单项的方法? 也许使用FragmentPageAdapter,但修改显示片段? 我的碎片修改?

这里是我的应用程序的一些代码片段…

在片段内如何创build菜单项:

@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { /* Create play button */ final MenuItem mPlay = menu.add(R.string.play_all); mPlay.setIcon(R.drawable.ic_play_all); mPlay.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); mPlay.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { final List<Song> songs = getSongs(); if (songs.size() == 0) { /* Show message */ Toast.makeText(mContext, R.string.no_song_list, Toast.LENGTH_LONG).show(); } else { /* Play song list */ try { PlayManager.getService().playList(songs); } catch (Exception e) {} } return false; } }); /* Create menu */ super.onCreateOptionsMenu(menu, inflater); } 

如何在ViewPager适配器中实例化碎片

 @Override public Fragment getItem(int position) { final Class<?> cls = mTabs.get(position); /* No tab */ if (cls == null) return null; /* Instantiate fragment */ final Fragment fragment = Fragment.instantiate(mContext, cls.getName(), null); /* Add to list */ mFragments.put(position, fragment); /* Return fragment */ return fragment; } 

谢谢!

PS:我试图改变activity的launchMode为“singleTop”,我也尝试在getItem()中返回以前创build的片段(但是这是没用的,因为getItem()从来没有被调用,当我回到应用程序,正如我所说之前)。

Solutions Collecting From Web of "FragmentStatePageAdapter复制ActionBar菜单项"

发布我的问题几天后,我find了解决scheme。 我很抱歉这么晚了

以下代码解决了我的问题:

 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.remove("android:support:fragments"); } 

就像在实例化和使用片段的活动中编写这段代码一样简单。

我希望这有帮助 :)

在ViewPager内的Fragment中的选项菜单被充气之前,检查Fragment实例是否可见,以防止重复的菜单项:

 // This should be in your Fragment implementation public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if(isVisible()) { inflater.inflate(R.menu.menu_fragment, menu); } super.onCreateOptionsMenu(menu, inflater); } 

我假设问题是每次你滑动FragmentStatePagerAdapter创build一个新的片段。 因此,为每个创build的Fragment调用onCreateOptionsMenu()。

我认为有两个解决scheme:

  1. 从碎片中取出操作栏的操作。 而不是为片段内的菜单项设置onclick,而是从Activity中向当前的片段发送消息。

  2. 使用Menu.findItem()来查看另一个Fragment是否已经添加了你想要的MenuItem,如果是的话,将当前的Fragment附加到它(在onPrepareOptionsMenu())。

我发现一些解决scheme尝试它可能是工作

onCreateOptionsMenu(Menu menu, MenuInflater inflater) menu.clear()菜单文件之前添加menu.clear() onCreateOptionsMenu(Menu menu, MenuInflater inflater)

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