Неожиданное поведение Viewpager с отсоединением / прикреплением фрагмента - PullRequest
0 голосов
/ 27 апреля 2020

В основной деятельности у меня есть структура кадра, в которую я помещаю фрагменты, используя менеджер фрагментов присоединение / отсоединение, чтобы сохранить состояние фрагмента. Все работает нормально, но в одном из моих фрагментов у меня есть видоискатель, который отображает другие фрагменты внутри. Когда я впервые добавляю этот фрагмент в свой фрейм-макет с помощью транзакции «добавить», он работает просто отлично, но когда я отсоединяю и снова присоединяю его, происходит что-то странное, содержимое виджета отсутствует, и когда я перемещаюсь между вкладками, он получает застрял как на этой картинке https://ibb.co/jw7NswY

Вот мой фрагмент onViewCreated:

@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    groupsViewModel = new ViewModelProvider(this).get(GroupsViewModel.class);

    //Setup groups pages
    viewPager = view.findViewById(R.id.view_pager_groups);
    viewPager.setOffscreenPageLimit(GROUPS_CATEGORIES_COUNT);
    viewPager.setAdapter(new GroupsPagerAdapter());

    TabLayout tabs = view.findViewById(R.id.tabs_groups);
    tabs.setupWithViewPager(viewPager);
    tabs.getTabAt(3).setIcon(R.drawable.ic_bookmarked);

    //Show/hide add group fab
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            showHideAddGroupFab(position);
        }

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });

}

и вот как я перемещаюсь между фрагментами:

    private void moveToFragment(MenuItem fragmentNavItem) {
    //Get toFragment given its id
    int id = fragmentNavItem.getItemId();
    FragmentManager fragmentManager = getSupportFragmentManager();
    String tag = getFragmentTagFromItemId(id);
    Fragment toFragment = fragmentManager.findFragmentByTag(tag);

    FragmentTransaction transaction = fragmentManager.beginTransaction();

    transaction.detach(activeFragment);
    if (toFragment == null) {
        //We go to this fragment for the first time
        toFragment = createFragmentFromItemId(id);
        transaction.add(R.id.frame_layout_main, toFragment, tag);
    } else {
        //We have been in this fragment before
        transaction.attach(toFragment);
    }

    transaction.commit();

    activeFragment = toFragment;
    toolbar.setTitle(fragmentNavItem.getTitle());
}

Кто-нибудь знает, почему это происходит?

1 Ответ

0 голосов
/ 28 апреля 2020

Кажется, это ошибка в viewpager, я перешел на viewpager2, и все работает отлично, как описано здесь https://developer.android.com/training/animation/vp2-migration

...