Android - 屏幕旋转时Fragment如何处理

15

我有一个FragmentActivity,里面包含一个ViewPager并且处理2个Fragments。

public class MyFragmentActivity extends FragmentActivity{

private Fragment f1; private Fragment f2; private ViewPager myPager; private MyFragmentAdapter mFragmentsAdapter; private static ArrayAdapter<Fragment> mFragmentArray; public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.my_layout); myViewPager = (ViewPager) findViewById(R.id.pager_acciones);
mFragmentArray = new ArrayAdapter<Fragment>(getApplicationContext(),android.R.layout.simple_list_item_1); f1 = new Fragment(); f1 = new Fragment();
mFragmentArray.add(f1); mFragmentArray.add(f2);
mFragmentsAdapter = new MyFragmentAdapter(getSupportFragmentManager()); myPager.setAdapter(mFragmentsAdapter); myPartidoPager.setCurrentItem(0);
}
public static class MyFragmentAdapter extends FragmentPagerAdapter { public AccionesFragmentAdapter(FragmentManager fm) { super(fm); }
@Override public int getCount() {
return mFragmentArray.getCount(); }
@Override public Fragment getItem(int position) {
return mFragmentArray.getItem(position); }
}

我的问题是:每次屏幕方向改变时,都会创建一个新的Activity以及两个新的Fragments。我不介意重新创建Activity,但不想让Fragments重新创建。


我在这里找到了解决方案。无论如何,还是感谢@oneilse14的回答。 - gutiory
3个回答

14

最简单的方法是在创建方法(on create)调用后立即添加一个if语句,并检查你是否已经有了一些内容。如果savedInstanceState不为空(null),则无需执行任何操作:

if (savedInstanceState == null){
  // do whatever 
} else {
  // dont do anything
}

(本答案更适合那些因无法理解为何片段在每次打开设备时都会被重新添加而陷入困境的人)


4
你可以在AndroidManifest.xml文件中添加: android:configChanges="screenSize|orientation" 这将防止Android在屏幕方向更改时调用onCreate。如果你想执行特殊的方向更改处理,可以重写onConfigurationChanges

8
难以置信这些答案仍然张贴在这里。最好看看这个链接:http://cyrilmottier.com/2014/09/25/deep-dive-into-android-state-restoration/ - dumazy
1
这种方法最显著的缺点之一是,如果不调用onCreate,Android将没有机会为横向和纵向加载不同的布局。 - Bob Cram

0
在 onSaveInstanceState 中保存你的 FragmentAdapter,并使用 onRetainNonConfigurationInstance 将其返回给 Activity,在配置更改后,这样片段就可以在屏幕方向变化时保留下来。

@oneilse12。谢谢您。但是使用FragmentActivity无法覆盖onRetainNonConfigurationInstance方法。 - gutiory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接