【问题标题】:ViewPager of Fragment does not show its content when the root Fragment is replaced again再次替换根Fragment时,Fragment的ViewPager不显示其内容
【发布时间】:2015-09-03 14:58:00
【问题描述】:

我正在实现包含root view pager 的fragment screen,其中包含child fragment,child fragment 的第一个view pager 显示图像。

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

请注意,当用户按下返回按钮时,fragment screen 会从返回堆栈中弹出,如果用户再次单击项目,fragment screen is replaced 的新实例 他们怎么了?

【问题讨论】:

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


【解决方案1】:

代替:

HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getFragmentManager());

试试:

HotelDetailPagerAdapter adapter = new HotelDetailPagerAdapter(getChildFragmentManager());

和

而不是:

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

试试:

FragmentTransaction ft = getChildFragmentManager().beginTransaction();

【讨论】:

  • 我又添加了 1 个修改。尝试改变它。
  • 难以置信。我有一个片段是托管一个viewpager。我必须将那个viewpager的适配器传递给getChildFragmentManager,否则什么都没有出现。非常感谢你的帖子。
  • 你拯救了我的一天
  • 难以置信。片段处理对我来说太难了。
  • 非常感谢。你拯救了我的一天
【解决方案2】:

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

看到这个答案https://stackoverflow.com/a/13391359/1635488

【讨论】:

  • 是的,当您想在片段中显示寻呼机适配器时,您必须使用 getChildFragmentManger(),而不是片段中的 getActivity().getSupportFragmentManager()
【解决方案3】:

我自己解决了我的问题。

从根本上说,像活动一样使用片段并不是一个好的设计。 即使fragment screen 被移除并销毁,fragment screen 的子片段也不会被销毁。

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

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

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

或者只是将fragment screen 更改为Activity。

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

玩得开心 :D 感谢您投票支持我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2011-12-05
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多