public class MainActivity extends SherlockFragmentActivity implements LibraryListener, DrawerListener {
private MainFragment mMainFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(new MainPagerAdapter(getSupportFragmentManager()));
}
public class MainPagerAdapter extends FragmentPagerAdapter {
public MainPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return (mMainFragment = new MainFragment());
case 1:
return new SubFragment();
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
private void hoge() {
mMainFragment.fuga();
}
}
このような場合、画面回転後に hoge() を呼ぶと mMainFragment が null なので NPE になります。なぜ mMainFragment が null になるかというと、FragmentPagerAdapter が一度 getItem() で生成した Fragment を再利用してくれるので、画面回転時に getItem() が呼ばれないからです。
画面回転後も mMainFragment に以前のインスタンスを保持させるには、次のように onSaveInstanceState() と onRestoreInstanceState() を使います。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mMainFragment != null) {
getSupportFragmentManager().putFragment(outState, "main_fragment", mMainFragment);
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (mMainFragment == null) {
mMainFragment = (MainFragment) getSupportFragmentManager().getFragment(savedInstanceState, "main_fragment");
}
}
実際に Fragment のインスタンスがこの処理で永続化されるわけではなく、画面回転後に以前のものと対応する Fragment を見つけてくるという処理です。