Подтвердить что ты не робот

ViewPager of Fragment не показывает свой контент, когда корневой фрагмент заменяется снова

Я реализую fragment screen, содержащий root view pager, который содержит child fragment, а первый из child fragment имеет view pager, который показывает изображения.

он показан очень хорошо в первый раз, но когда fragment, который содержит root view pager, удаляется и заменяется снова (с новым ключевым словом для fragment screen), roow view pager не показывает child fragment.

вот часть моего источника.

    @AfterViews // this is the method of fragment screen
    protected void afterViews() {
        api(HotelDetailAPI.class).getProduct("hotels", getArguments().getInt("itemId"), new Callback<Hotel>(this) {
            @Override
            public void success(Hotel _hotel, Response response) {
                hotel = _hotel;
                HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getFragmentManager());
                contentViewPager.setAdapter(adapter);
                contentViewPager.setBackgroundColor(0xffffff);
                super.success(hotel, response);
            }

            @Override
            public void failure(RetrofitError error) {
                super.failure(error);
                LOG.error("failed");
            }
        });
    }


private class HotelDetailPagerAdapter extends FragmentPagerAdapter {
        List<Fragment> fragments = new ArrayList<>();

        public HotelDetailPagerAdapter(FragmentManager fm) {
            super(fm);
            Bundle data = new Bundle();
            data.putSerializable("hotel", hotel);
            Fragment fragment1 = new HotelDetailReservationFragment_();
            Fragment fragment2 = new HotelDetailReservationFragment_();
            Fragment fragment3 = new HotelDetailReservationFragment_();
            fragment1.setArguments(data);
            fragment2.setArguments(data);
            fragment3.setArguments(data);
            fragments.add(fragment1);
            fragments.add(fragment2);
            fragments.add(fragment3);
        }

        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }

        @Override
        public int getCount() {
            return 3;
        }
    }


// this is the first fragment of root view pager it not shown again.
@EFragment(R.layout.fragment_hotel_detail_reservation)
public class HotelDetailReservationFragment extends BaseFragment {
    private Hotel hotel;

    @AfterViews
    public void afterViews() {
        hotel = (Hotel)getArguments().getSerializable("hotel");
        FragmentTransaction ft = getBaseActivity().getFragmentManager().beginTransaction();
        Fragment fragment = new ImageSliderFragment_();
        Bundle data = new Bundle();
        data.putStringArray("images", hotel.getImages());
        fragment.setArguments(data);
        ft.add(R.id.hotel_detail_image_slider_container, fragment);
        ft.commit();
    }
}

обратите внимание, что fragment screen выставляется из предыдущего стека, когда пользователь нажимает кнопку "Назад", и если пользователь снова нажимает элемент, новый экземпляр fragment screen is replaced что с ними не так?

4b9b3361

Ответ 1

Я решил свою проблему от себя.

По сути, это не очень хороший дизайн с использованием фрагмента, подобного активности. Даже если fragment screen удаляется и уничтожается, фрагменты детей fragment screen не уничтожаются.

В моей проблеме дети первого fragment screen не были уничтожены, поэтому мой адаптер пейджера снова использует детей. это вызывает неправильное поведение пейджера представления.

для этой проблемы существует различное решение.

вы можете уничтожить все фрагменты детей fragment screen, когда fragment screen будет уничтожен.

или просто измените fragment screen на Activity.

Я применил последний метод, он хорошо работает: D

хорошо проводите время: D спасибо за голосование за мой вопрос.

Ответ 2

Вместо:

HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getFragmentManager());

Попробуйте:

HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getChildFragmentManager());

и

Вместо:

FragmentTransaction ft = getBaseActivity().getFragmentManager().beginTransaction();

Попробуйте:

FragmentTransaction ft = getChildFragmentManager().beginTransaction();

Ответ 3

Проблема в том, что у вас есть вложенные фрагменты и используйте getFragmentManager(); Вместо этого следует использовать getChildFragmentManager().

См. этот ответ fooobar.com/info/72975/...