Android 旋转时错误地重新创建了碎片

Android 旋转时错误地重新创建了碎片,android,android-fragments,android-viewpager,android-fragmentactivity,Android,Android Fragments,Android Viewpager,Android Fragmentactivity,我有一个FragmentActivity,它通过ViewPager显示一些片段。这是我的代码片段 MyFragmentActivity 片段由FragmentPagerAdapter动态创建,并取决于接收到的数据 屏幕旋转时,我的应用程序崩溃。通过一些搜索,我了解到,当配置发生更改时,旧的片段不会被销毁——它会在重新创建时将自己添加回活动中。此时,重新创建的片段的数据为空,因此它在onCreateView中崩溃 有人说FragmentStatePagerAdapter应该能用,但不适合我的情况。

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

MyFragmentActivity

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

屏幕旋转时,我的应用程序崩溃。通过一些搜索,我了解到,当配置发生更改时,旧的片段不会被销毁——它会在重新创建时将自己添加回活动中。此时,重新创建的片段的数据为空,因此它在onCreateView中崩溃

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

更新

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

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

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

您应该自己处理方向更改

它包含在配置更改下的开发人员资源中,基本上,这意味着在AndroidManifest中添加属性configChanges=orientation。然后,当方向更改时,将调用Activity.OnConfiguration更改

例如,见

通常情况下,这个手动手柄会导致你的碎片被放置,所以它的大小会自动改变

另一个解决办法是保持这样:我的意思是,在方向改变时,你的 正在重新创建活动,您的片段也是如此。
因此,您需要确保片段中的数据可用,如果不可用,则最终加载数据。

谢谢您的提示。受第二种解决方案的启发,setRetainInstance最终完成了简单的技巧。我的片段碰巧不在后堆栈中,因此setRetainInstance有效。请检查我的更新,我删除了setRetainInstance技巧,并成功还原数据如果您所做的解决了问题,请将其作为答案发布,然后接受
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;
        }
    }
Bundle b = new Bundle();
b.putString("data", data.toString());
f.setArguments(b);