我正在实施包含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();
}
}
的新实例
他们怎么了?
答案 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()。
答案 2 :(得分:4)
我已经解决了自己的问题。
从根本上说,使用像活动这样的片段并不是一件好事。
即使fragment screen
被删除和销毁,fragment screen
的子片段也不会被销毁。
在我的问题中,第一个fragment screen
的孩子没有被销毁,所以我的寻呼机适配器再次重用孩子。这会导致查看寻呼机的错误行为。
这个问题有各种解决方案。
当fragment screen
被销毁时,您可以销毁fragment screen
的所有子片段。
或只是将fragment screen
更改为Activity
。
我已应用最后一种方法,效果很好:D
玩得开心:D谢谢你投票我的问题。