片段在旋转时错误地重新创建

时间:2014-08-20 08:32:42

标签: android android-fragments android-viewpager android-fragmentactivity

我有一个FragmentActivity,它通过ViewPager显示一些片段。这是我的代码段,

MyFragmentActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    viewPager = (ViewPager) findViewById(R.id.pager);

    fetchDataAsync(this);
}

@Override
private void onDataReceived(List<String> data) {
    viewPager.setAdapter(new MyFragmentPageAdapter(getChildFragmentManager()), data);
}

MyFragmentPagerAdapter

private class MyFragmentPagerAdapter extends FragmentPagerAdapter {
        private Data data;

        public MyFragmentPagerAdapter(FragmentManager fm, Data data)
        {
            super(fm);
            this.data = data;
        }

        @Override
        public Fragment getItem(int position) {
            return MyFragment.newInstance(data.get(position));
        }

        @Override
        public int getCount() {
            return data.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return null;
        }
    }

片段由FragmentPagerAdapter动态创建,并取决于收到的数据。

当屏幕旋转发生时,我的应用程序崩溃了。通过一些搜索,我了解到&#34;当配置更改发生时,旧的片段不会被破坏 - 它会在重新创建活动后自行添加回活动&#34; 。此时,重新创建的片段的数据为空,因此它在onCreateView上崩溃。

有人说FragmentStatePagerAdapter可以工作但不适用于我的情况。另一个说重用片段而不是重新创建新片段,但ViewPager会自动创建它们,我该如何管理它。我想永久销毁旧的碎片而不是将它们重新添加到活动中,我该怎么办?

已更新

我从MyFragment中删除了构造函数param,并通过setArgument

传递它
Bundle b = new Bundle();
b.putString("data", data.toString());
f.setArguments(b);

现在片段可以在重新创建时恢复数据,因为当配置更改发生时,MyFragment可以以这种方式保存状态(数据)

1 个答案:

答案 0 :(得分:0)

您应该自己处理方向更改。

在配置更改下,开发人员资源会覆盖它,基本上,这意味着会在AndroidManifest属性configChanges="orientation"中添加。然后,当方向发生变化时,将调用Activity.onConfigurationChanged

参见例如Activity under Configuration Changes

通常情况下,此手动句柄会导致您的片段被布局,因此其大小应自动更改。


另一种解决方案是保持这样:我的意思是,在方向更改时,您的 Activity正在重新创建,您的Fragment也是如此。 因此,您需要在片段中确保数据可用,如果没有则最终加载它们。