【发布时间】:2015-03-27 13:43:35
【问题描述】:
我对 FragmentStatePageAdapter(我用作 ViewPager 的适配器)和操作栏中的菜单项有疑问。
当我启动应用程序时,一切都很好。如果我将任务移到后台(例如,按 HOME 按钮)并开始做一些事情直到活动结束,那么当我回到我的应用程序(通过启动器或我创建的通知)时,一切都很好,除了有操作栏中的重复菜单项。
一个重要的细节是,唯一重复的项目是在我在 ViewPager 中使用的每个片段的 onCreateOptionsMenu() 中创建的那些。
如果我用 FragmentPageAdapter 替换FragmentStatePageAdapter,则项目不再重复,但片段不会显示在 ViewPager 中(永远不会调用适配器的 getItem() 函数,因此它不会返回任何片段)。
有什么想法吗?一种避免 FragmentStatePageAdapter 重复菜单项的方法?也许使用 FragmentPageAdapter 但进行修改以显示片段?对我的片段进行了修改?
这是我的应用程序中的一些代码 sn-ps...
如何在片段中创建菜单项:
@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:我尝试将活动的 launchMode 更改为“singleTop”,并且我还尝试在 getItem() 中返回先前创建的片段(但这没用,因为当我返回应用程序时从未调用 getItem(),正如我之前所说)。
【问题讨论】:
-
你好,米格尔!你找到解决办法了吗?
-
是的。我刚刚在我使用的解决方案下方发布。这不是真正的修复,而是一种解决方法。
标签: android android-fragments android-viewpager