我遇到了FragmentStatePageAdapter(我用作ViewPager的适配器)和操作栏中的菜单项的问题。
当我启动应用程序时,一切都很好。如果我将任务移动到后台(例如,按下HOME按钮),我开始做东西,直到活动结束,然后当我回到我的应用程序(通过启动器或我创建的通知)一切都很好,除了有操作栏中的重复菜单项。
一个重要的细节是,唯一重复的项目是我在ViewPager中使用的每个片段的onCreateOptionsMenu()中创建的项目。
如果我用FragmentPageAdapter替换FragmentStatePageAdapter,则不再复制项目,但是ViewPager中没有显示片段(从不调用适配器的getItem()函数,因此它不会返回任何片段。)
有什么想法吗?一种避免FragmentStatePageAdapter复制菜单项的方法?也许使用FragmentPageAdapter,但有一个修改来显示片段?我片段的修改?
以下是我的应用程序中的一些代码段...
如何在片段内创建菜单项:
@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()这是无用的,正如我之前所说的那样。)
答案 0 :(得分:3)
我在发布问题几天后找到了解决问题的方法。我很抱歉这么晚才把它放在这里。
以下代码解决了我的问题:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.remove("android:support:fragments");
}
就像在我实例化并使用片段的活动中编写那段代码一样简单。
我希望这会有所帮助:)
答案 1 :(得分:3)
在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);
}
答案 2 :(得分:2)
我认为问题在于每次滑动时FragmentStatePagerAdapter都会创建一个新的Fragment。因此,为每个创建的片段调用onCreateOptionsMenu()。
我认为有两种解决方案:
从Fragments中取出操作栏操作。您可以从活动中向当前片段发送消息,而不是为片段内的菜单项设置onclick。
使用Menu.findItem()查看另一个片段是否已添加了您想要的MenuItem,如果是,则将当前片段附加到它(在onPrepareOptionsMenu()中)。
答案 3 :(得分:0)
我找到了一些解决方案,尝试它可能是有效的
在您的重复菜单片段中
在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);
}