産廃置き場出張所

気が向いたら書きます

Androidアプリ開発でレイアウトXMLに埋め込んだFragmentを置き換えてはいけなかったお話

まとめ

休日の半日ほど溶かしてしまったのでメモ。
レイアウトXMLに埋め込んだFragmentの置き換えはおそらく思った通りの動作となりません。
私の中ではアプリ起動時のActivityの初期化処理(onCreateあたり?)でコード上でFragmentを追加することに落ち着きました。
参考:android - Fragmentをreplaceしても一つ前のFragmentが残る - スタック・オーバーフロー

経緯

サーモン爆破クリッカーAndroid移植中、Fragmentの置き換え後にエフェクトが表示されないというバグに遭遇しました。
画面イメージと簡単なレイアウト構成は以下の通りです。

LinearLayout
  |- 広告ビュー
  |- Fragment
  |- LinearLayout
       |- ImageButton
       ...

画面中央の何かをタップすると爆破エフェクトとともにサーモン数が増えます。
当初はFragmentも初期状態のものをレイアウトXMLに決め打ちで記述していました。

モード切替はImageButtonのリスナにFragmentのreplaceを行う処理を設定することで行っていました。
Fragmentのreplace処理を実装し、モード切替のテストをしていたところ、一度他のモードに切り替えてからクリッカーモードに戻すと表示されるはずの爆破エフェクトが表示されなくなりました。

その後、紆余曲折を経てFragmentをLinearLayoutに埋め込んでモード切替をするとFragmentの一部のViewが切り替え後も残ることが判明、冒頭の質問と回答を発見し、FragmentをActivityのonCreateメソッドで追加することで解決しました。

変更後のレイアウトはこんな感じです。

LinearLayout
  |- 広告ビュー
  |- LinearLayout <- ActivityのonCreateメソッドでFragmentをここにadd
  |- LinearLayout
       |- ImageButton
       ...