【问题标题】:Fragments in viewpager浏览器中的片段
【发布时间】:2013-09-04 08:05:01
【问题描述】:

我有一些片段的 viewpager,我为每个片段设置了我的模型类,根据片段的 UI 应该被编辑。在我将该片段添加到 FragmentStatePagerAdapter 之前,我在构造函数中设置为片段的那个模型类。我的问题是,在旋转屏幕后或当系统杀死我的应用程序并恢复它时,我的片段被系统重新创建并且我的模型类实例丢失了。即使我设置了新的 FragmentStatePagerAdapter,系统创建的片段也是可见的。是否有任何正确的方法可以实现我创建片段的新实例并将它们放入 viewpager 中?我尝试了很多想法,例如从 FragmentManager 中删除片段,再次将 Adapter 添加到 viewpager,仅将 FragmentStatePagerAdapter 更改为 FragmentPagerAdapter,但没有任何帮助。

我的活动类在加载器中从某些资源加载模型类:

        List<Fragment> visibleFragment = new ArrayList<Fragment>();
        for (Screen screen : wizard.screens) {
            if (screen.visible) {
                visibleFragment.add(new ScreenUI(screen));
            }
        }
        viewPager.setAdapter(null);
        viewPager.setAdapter(new WizardPagerAdapter(getSupportFragmentManager(), visibleFragment));

我的 FragmentStatePagerAdapter

public class WizardPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments;
private final int count;

public WizardPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
    super(fm);
    mFragments = fragments;
    count = mFragments.size();
}

@Override
public Fragment getItem(int index) {
    return mFragments.get(index);
}

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

【问题讨论】:

  • 活动正在重新加载屏幕方向更改?
  • 您是否在 Manifest 文件的活动元素中添加了 screenSize?它将阻止屏幕旋转中的活动娱乐。而且在你的片段构造器中,一定要检查视图是否不为空。
  • 是的,Activity 正在重新加载,并且在加载程序完成之前调用了 onCreateView 和 onResume 等片段生命周期方法。我不想将配置更改添加到清单文件

标签: android android-viewpager


【解决方案1】:

尝试将 Manifest android:configChanges="orientation|keyboardHidden|screenSize" 添加到活动中。

或者类似的东西

public class ViewPagerTaskAdapter extends FragmentStatePagerAdapter {
Map<Integer, FragmentViewTask> fragmentsTask = new HashMap<Integer, FragmentViewTask>();
@Override
    public Fragment getItem(int arg0) {
        FragmentViewTask myFragment = FragmentViewTask.newInstance(arg0,
                tasks.get(arg0));
        fragmentsTask.put(arg0, myFragment);
        return myFragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
        fragmentsTask.remove(position);
    }
        public FragmentViewTask getFragment(int key) {
        return fragmentsTask.get(key);
    }

    @Override
    public int getCount() {
        if (tasks != null)
            return tasks.size();

        return 0;
    }

}

【讨论】:

  • 它不是禁止系统配置更改的通用解决方案
【解决方案2】:

您是否尝试过在您的Fragments 上使用onRetainInstance(true)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);    
}

【讨论】:

  • 是的,当屏幕方向改变时解决了问题,但当系统杀死我的应用程序时没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多