12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

addToBackStackメソッドの呼び出しタイミングと引数について

Posted at

先日よりandroidアプリ開発をスタートし、テキストを見ながら勉強している最中に、
addToBackStackメソッドの使い方について疑問点があったので、書き残しておく。

アプリの動作としては、項目一覧を選択した際に、選択項目の詳細画面に遷移し、
戻るボタンを押したときに一覧に戻る、というもの。

戻り先の状態を保存するため、addToBackStackメソッドを使う。
テキストに記載されていたaddToBackStackの用法は以下の通り。

//一覧を詳細に置き換え
fragmentTransaction.replace(R.id.fragment1,myFragment2);

//戻るボタンを押したときの処理用に元のトランザクションを保存
fragmentTransaction.addToBackStack(null);

このコードを見て疑問に思った点は以下の2点。
1.メソッドの呼び出しタイミング
2.メソッドの引数

上記2点について調べた内容を以下にまとめる。

#1.メソッドの呼び出しタイミング
上記コードを見ると、
fragmentTransaction.replaceメソッドでFragmentを入れ替えた後、
fragmentTransaction.addToBackStackメソッドで状態を保存している。

ここでの疑問は、
入れ替えた後保存したら、戻り先の状態を保存できないのではないかという疑問だ。
つまり、
Fragment入れ替え⇒保存
ではなく、
保存⇒Fragment入れ替え
とすべきではないかと考えた。

そこで、Android DevelopersのaddToBackStackの説明を見ると、

Add this transaction to the back stack. This means that the transaction will be remembered after it is committed, and will reverse its operation when later popped off the stack.

ざっくり訳すと、
transactionをスタックに保存します。コミットされた後にスタックに記録されます。
スタックからpopされると元に戻されるでしょう。

残念ながら答えは得られなかった。
その後もブログ等を探していったが、明確な回答を得られず。
その後、タブレットとスマホで画面レイアウトを変更することについて調べていたら、
答えが見つかった。
fragmentsの解説のページ(https://developer.android.com/guide/components/fragments.html?hl=ja)に
以下の記述を見つけた。

トランザクションに複数の変更を加えて(add() や remove() など)、addToBackStack() を呼び出した場合、commit() を呼び出す前に適用されたすべての変更点が 1 つのトランザクションとしてバックスタックに追加され、「戻る」ボタンを選択すると、すべてが同時に元に戻るようになります。

つまり、addToBackStackメソッドでは差分が保存されるということであった。
差分を保存するのであれば、Fragment入れ替え⇒保存で納得。

#2.メソッドの引数
これは単純に「引数がNULLってどういうこと?」という疑問。

この疑問は、Android-Noteさんの解説記事
http://android-note.open-memo.net/sub/fragment__fragment_stack.html)
に以下の記載があった。

もし、スタックに保存するフラグメントが複数なく、現在のものだけを保存する場合は次のようにnullを渡します。

なるほど。

以上。
#githubリンク
リポジトリ
https://github.com/tagfa/MyGUIFragmentDynamic02
addToBackStackメソッドの利用箇所
https://github.com/tagfa/MyGUIFragmentDynamic02/blob/master/app/src/main/java/com/example/tag/myguifragmentdynamic02/MainActivity.java

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?