当再次替换根片段时,ViewPager of Fragment不会显示其内容

cra*_*udy 22 android android-layout android-fragments android-viewpager

我正在实现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's 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,fragment screen当用户按下后退按钮时会从后堆栈中弹出,如果用户再次单击了该项目,fragment screen is replaced 那么它们的新实例是什么?

Tig*_*ger 39

代替 :

HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getFragmentManager());
Run Code Online (Sandbox Code Playgroud)

试试:

HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)

代替 :

FragmentTransaction ft = getBaseActivity().getFragmentManager().beginTransaction();
Run Code Online (Sandbox Code Playgroud)

试试:

FragmentTransaction ft = getChildFragmentManager().beginTransaction();
Run Code Online (Sandbox Code Playgroud)

  • `getChildFragmentManager()`为我工作. (5认同)

and*_*dev 17

问题是你有嵌套的片段并使用getFragmentManager(); 您应该使用getChildFragmentManager()代替.

请参阅此答案/sf/answers/937395161/


cra*_*udy 4

我已经从自己身上解决了我的问题。

从根本上来说,像 Activity 这样使用 Fragment 并不是一个好的设计。即使fragment screen被移除和破坏,子碎片也fragment screen不会被破坏。

在我的问题中,第一个的子级fragment screen没有被销毁,因此我的寻呼机适配器再次重用子级。这会导致视图寻呼机的错误行为。

这个问题有多种解决方案。

fragment screen您可以在fragment screen被销毁时销毁所有子片段。

或者只是更改fragment screenActivity.

我已经应用了最后一种方法,效果很好:D

祝您玩得愉快:D 感谢您对我的问题进行投票。