FragmentPagerAdapter getItem未被触发

时间:2013-03-23 14:51:29

标签: android android-fragments android-viewpager fragmentpageradapter

目前,使用FragmentActivity时,我使用以下代码在2种类型的片段之间切换。

private void toggle() {
    Fragment oldFragment = getSupportFragmentManager().findFragmentById(R.id.content);
    Fragment fragment = null;
    if (oldFragment instanceof ColorFragment) {
        fragment = new ViewPagerFragment();
    } else {
        fragment = new ColorFragment(android.R.color.black);
    }

    getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss();
}

2片段正在切换。

  • ColorFragment - 一个简单的片段,用纯黑色填充背景。
  • ViewPagerFragment - 片段包含ViewPager。用户可以在紫色片段和蓝色片段之间滑动。

负责刷紫色和蓝色碎片的代码如下。

private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new ColorFragment(android.R.color.holo_purple);
        default:
            return new ColorFragment(android.R.color.holo_blue_bright);
        }
    }      
} 

然而,我在切换期间遇到了奇怪的行为。

  1. 显示黑色片段。
  2. 切换。
  3. 查看寻呼机,可以在显示的紫色和蓝色片段之间滑动。
  4. 切换。
  5. 显示黑色片段。
  6. 切换。
  7. 没有显示,因为没有触发MyFragmentPagerAdapter的getItem。
  8. 我认为我的情况类似于FragmentPagerAdapter getItem is not called

    但是,我不想使用FragmentStatePagerAdapter,因为在页面之间切换时可能会产生更多开销。

    解决此问题的任何解决方法?

    我提供了一个完整可行的源代码来演示此问题:https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip

5 个答案:

答案 0 :(得分:108)

  

解决此问题的任何解决方法?

我已下载您的代码并出现问题,因为您没有正确处理这些Fragments。最精确的是,您在基于Fragments ViewPager的{​​{1}}中使用嵌套Fragment,并为ViewPager创建适配器,如下所示:

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getFragmentManager());

相反,您应该使用getChildFragmentManager()绑定嵌套片段:

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

此外,您不应该通过构造函数将数据传递给Fragment,因为数据将无法在配置更改后继续存在,并且会出现不良内容。请改用Bundle

答案 1 :(得分:12)

全球工作测试解决方案。

getSupportFragmentManager()保留空引用一些次,而View寻呼机不会创建新的片段实例。因为它找到对同一片段的引用。所以过度使用getChildFragmentManager()以简单的方式解决问题。

不要

<强> new PagerAdapter(getSupportFragmentManager(), fragments);

<强>不要

<强> new PagerAdapter(getChildFragmentManager() , fragments);

答案 2 :(得分:1)

在我的情况下,我正确地打电话

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

但是在嵌套片段中,我试图用另一个替换容器片段:

getFragmentManager()

您需要转到活动并致电

getActivity().getSupportFragmentManager();

答案 3 :(得分:0)

在我的情况下,将其添加到我的 FragmentPagerAdapter 后,它有效:

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

我还使用 getChildFragmentManager(),就像Luksprog所说

答案 4 :(得分:0)

简单使用FragmentStatePagerAdapter代替FragmentPagerAdapter

您可以使用new MyFragmentPagerAdapter(this.getChildFragmentManager())

希望它会对你有所帮助:)。