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

我正在实现包含root view pagerfragment screen ,其包含child fragment并且child fragment的第一个具有显示图像的view pager

它在第一次显示相当不错,但是当包含root view pagerfragment被删除并再次替换时(使用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(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 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(); } } 

请注意,当用户按下后退按钮时, fragment screen会从后面的堆栈中popup,如果用户再次单击该项目,则fragment screen is replaced新实例fragment screen is replaced它们的错误?

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

代替 :

 HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getFragmentManager()); 

试试:

 HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getChildFragmentManager()); 

代替 :

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

试试:

 FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 

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

请参阅此答案https://stackoverflow.com/a/13391359/1635488

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

从根本上说,使用像活动这样的片段并不是一件好事。 即使fragment screen被删除和销毁, fragment screen的子片段也不会被破坏。

在我的问题中,第一个fragment screen子节点没有被销毁,所以我的寻呼机适配器再次重用子节点。 这会导致查看寻呼机的错误行为。

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

fragment screen被破坏时,你可以销毁fragment screen所有子片段。

或者只是将fragment screen更改为Activity

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

玩得开心:D谢谢你投票给我的问题。