FragmentPagerAdapter getItem未被触发

Che*_*eng 38 android android-fragments android-viewpager fragmentpageradapter

目前,使用a 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();
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }      
} 
Run Code Online (Sandbox Code Playgroud)

但是,我在翻转期间遇到了奇怪的行为.

  1. 显示黑色片段.
  2. 切换.
  3. 查看寻呼机,可以在显示的紫色和蓝色片段之间滑动.
  4. 切换.
  5. 显示黑色片段.
  6. 切换.
  7. 没有显示,因为没有触发MyFragmentPagerAdapter的getItem.

我认为我的情况类似于FragmentPagerAdapter,没有调用getItem

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

解决这个问题的任何解决方法?

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

Luk*_*rog 111

解决这个问题的任何解决方法?

我已经下载了您的代码,问题出现了,因为您没有Fragments正确处理这些问题.最精确的是你使用嵌套FragmentsViewPager基础上Fragment,为此ViewPager你创建适配器,如下所示:

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getFragmentManager());
Run Code Online (Sandbox Code Playgroud)

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

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)

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

  • 你的`ViewPagerFragment`示例中的@CheokYanCheng`getFragmentManager()`将从`Activity`返回`FragmentManager`(它基本上是用于添加`Fragment`的`FragmentActivity`中的`getSupportFragmentmanager()`的值).当您使用嵌套片段时,它们需要`getChildFragmentManager()`,以便它们可以附加到父片段.`getFragmentManager()`和`getChildFragmentManager`**在`Fragment`中不是同一个东西(一个返回与该片段相关的片段,另一个是用于其嵌套片段的fragmentmanager). (12认同)
  • 如果我可以+1更多,那么我会!非常感谢答案和解释! (2认同)

Vin*_*yak 12

全球工作测试解决方案

getSupportFragmentManager()保留空引用一些时间,View寻呼机不会创建新的片段实例.因为它找到对同一片段的引用.因此,这种用法getChildFragmentManager()以简单的方式解决了问题.

new PagerAdapter(getSupportFragmentManager(), fragments);

new PagerAdapter(getChildFragmentManager() , fragments);