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

时间:2014-07-30 02:40:09

标签: android android-layout android-fragments android-viewpager

我正在实施包含fragment screen的{​​{1}} root view pager,其中child fragment的第一个child fragment显示图片。

第一次显示相当不错,但当包含view pager的{​​{1}}被删除并再次替换时(使用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(); } } 的新实例 他们怎么了?

3 个答案:

答案 0 :(得分:35)

而不是:

HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getFragmentManager());

尝试:

HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getChildFragmentManager());

而不是:

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

尝试:

FragmentTransaction ft = getChildFragmentManager().beginTransaction();

答案 1 :(得分:16)

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

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

答案 2 :(得分:4)

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

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

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

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

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

或只是将fragment screen更改为Activity

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

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