FragmentStatePageAdapter дублирует пункты меню ActionBar

, у меня возникнет проблема с FragmentStatePageAdapter (, который я использую в качестве адаптера для ViewPager )и пунктов меню из панели действий.

Когда я запускаю приложение, все в порядке. Если я перемещаю задачу в фоновый режим (, например, нажимаю кнопку HOME )и начинаю что-то делать до тех пор, пока действие не завершится, тогда, когда я возвращаюсь к своему приложению (через панель запуска или уведомление, я создаю )все хорошо, за исключением того, что в панели действий есть дублирующиеся пункты меню.

Важной деталью является то, что дублируются только те элементы, которые создаются в onCreateOptionsMenu ()каждого фрагмента, который я использую в ViewPager.

Если я заменю FragmentStatePageAdapter на FragmentPageAdapter, элементы больше не будут дублироваться, но фрагменты не будут отображаться в 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 ()никогда не вызывается, когда Возвращаюсь к приложению, как уже говорил ).

9
задан Miguel Botón 7 May 2012 в 15:45
поделиться