我有一个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可以以这种方式保存状态(数据)
答案 0 :(得分:0)
您应该自己处理方向更改。
在配置更改下,开发人员资源会覆盖它,基本上,这意味着会在AndroidManifest
属性configChanges="orientation"
中添加。然后,当方向发生变化时,将调用Activity.onConfigurationChanged
。
参见例如Activity under Configuration Changes
通常情况下,此手动句柄会导致您的片段被布局,因此其大小应自动更改。
另一种解决方案是保持这样:我的意思是,在方向更改时,您的
Activity
正在重新创建,您的Fragment
也是如此。
因此,您需要在片段中确保数据可用,如果没有则最终加载它们。