おすしたべたい

おすしがたくさん食べられるようにがんばるブログ

画面が回転するとFragmentが初期化されて困る問題

Androidアプリ開発については結構初心者なんですが、Androidアプリって画面が回転するとActivityが再生成されちゃうんですね。

その時、ActivityにくっついてるFragmentがもつ変数とかが全部初期化されてしまってヌルポで落ちるみたいな現象に直面しました。

この手の問題は結構みんな通る道らしく、ぐぐってみるとsetRetainInstance(true)しようよ!って記事が沢山出てきました。

もちろんどういうふうに実装してるのかによると思うんですが、私の環境だとこれだけだと治りませんでした。

というのも、下記のようにActivity側のonCreate()でFragmentを追加してたんですが

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

  FragmentManager manager = getFragmentManager();
  Fragment fragment = OsushiFragment.newInstance();
  FragmentTransaction fragmentTransaction = manager.beginTransaction();
  fragmentTransaction.replace(android.R.id.content, fragment);
  fragmentTransaction.commit();
}

よく考えたら、Activityが再生性されるときもonCreateを通るのだから、ここでFragment初期化する処理自分で書いてるぞ!!ってことで、以下のようにsavedInstanceStateがnullかどうかのチェックをカチこんで、2回目からは初期化されないようにしたらうまくいきましたとさ。

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

  if (savedInstanceState == null) {
    FragmentManager manager = getFragmentManager();
    Fragment fragment = OsushiFragment.newInstance();
    FragmentTransaction fragmentTransaction = manager.beginTransaction();
    fragmentTransaction.replace(android.R.id.content, fragment);
    fragmentTransaction.commit();
  }
}