FragmentStatePageAdapter复制ActionBar菜单项

Mig*_*tón 9 android android-fragments android-viewpager

我有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);
}
Run Code Online (Sandbox Code Playgroud)

如何在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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

PS:我试图将活动的launchMode更改为"singleTop",并且我还试图在getItem()中返回普遍创建的片段(但是当我返回应用程序时,从未调用getItem()这是无用的,正如我所说的之前).

Mig*_*tón 3

在发布问题几天后,我找到了问题的解决方案。很抱歉这么晚才把它放在这里。

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

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.remove("android:support:fragments");
}
Run Code Online (Sandbox Code Playgroud)

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

我希望这有帮助 :)