androidでpop up toを使いこなす

目次

  1. 背景
  2. Back Stackについて
  3. Popup to
  4. popUpToInclusive
  5. まとめ
  6. 参考

背景

こんにちは。karintomania(twitter)です。

androidアプリ開発の際に戻るボタンの挙動を制御するため、
popuptoというプロパティを設定する必要がありますが、
分かりづらかったので、解説を少々。

Back Stackについて

androidアプリでは画面遷移のたびに、
戻るボタンを押した際に遷移するページをバックスタックとして保存しています。

以下のようなゲームアプリを想定してみます。
a: タイトル
b: ゲーム画面
c: 結果

普通にタイトルから、
ゲーム開始、結果確認、タイトルに戻り再プレイ・・・
と画面遷移を繰り返すと、
a - b - c - a - b - c -...
と無限にバックスタックが積まれていってしまいます・

ですが、理想的な動きとしては、
c - aに戻った際にバックスタックをクリアして欲しいところです。

また、考慮が漏れがちですが、b - cに画面遷移をする際に
bをバックスタックから削除しておかないと結果画面から直接プレイ画面に戻ってしまいます。
もちろんアプリの仕様によってはそれもありかもしれませんが、今回はそれを許容しないことにします。

b - cの実装を先にします。

navigation.xmlをandroid studioで開きます。

b - c の画面遷移をクリックし、
attribute欄のpopup toプロパティを設定します。

*画像ではpopUpToInclusiveがTrueになっていますが、Falseになっているのが正しい設定です。
ここに関しては後述します。

ここにはバックスタックでどこの画面まで削除したいかを指定します。
今回の場合、aを指定するとa以降にバックスタックに積まれたものが削除されます。

今回の例では、バックスタックは
a - b - c
となっていたので、bが削除され、
a - c
となります。これで結果確認画面で戻るボタンを押した際には、タイトル画面に戻るようになりました。

popUpToInclusive

c - aの実装もやってみます。

先ほど同様、c - a の画面遷移をクリックし、popUpToにAを指定します。
これによって画面遷移前には
c - a
だったバックスタックがaを残して削除されます。

しかし、初回のaは削除されないままのため、
その後にaに画面遷移すると2回目のaもバックスタックに積まれることになり、
a - a
となってしまいます。

つまり、画面遷移の際に初回のaも削除する必要があります。

その際にpopUpToInclusiveを指定します。
こうすることでc - aの画面遷移の際に
バックスタックが全て削除されます。

まとめ

popUpTo
指定した画面までのバックスタックを削除する

popUpToInclusive
指定した画面を含めてバックスタックを削除する

参考

ぜひ公式も参考にしてください。
https://developer.android.com/guide/navigation/navigation-navigate#pop

それでは今日はこの辺で。