バックスタックの仕様と操作を理解する2017年10月22日(編集2017年10月22日)TweetAndroidアプリを作成するとき、Fragmentの管理をバックスタックに任せることが多々あります。この記事は、Androidアプリでバックスタックを使って、Fragmentを管理する方法を記載した記事です。中級者向けサンプルコードAndroid-Basic-Technique-Demoバックスタックスタック構造でFragmentやAcitivtyを扱うことをバックスタックといいます。Fragmentは、FragmentManagerクラスとFragmentTransactionクラスを使ってバックスタックで管理します。バグの原因になりやすいので、しっかりとした学習が必要です。サンプルアプリ設計メイン画面を扱うFragmentをActivityに重ねます。メインFragmentからさらにFragmentを追加するアプリを作成します。バックスタックなしでFragmentを追加バックスタックを使わないでRootActivityにMainFragmentを追加します。MainFragment.NAME)transaction.commitAllowingStateLoss()FragmentTransaction#addメソッドでレイアウトで定義したFrameLayout(R.id.frag)にFragmentを追加します。FragmentTransaction#commitAllowingStateLossでトランザクションをコミットします。上記のソースコードは、バックスタックにFragmentが追加されません。バックスタックに追加されないことをコードで確認してみましょう。バックスタックの数は以下のように取得します。supportFragmentManager.backStackEntryCount.toString()}FragmentManager#getBackStackEntryCountメソッドは現在のバックスタックにあるエントリの数を返します。このメソッドは、FragmentManager.javaで以下のように実装されています。mBackStackはArrayListクラスです。getBackStackEntryCountメソッドはBackStackの数を返しています。上記のコードをボタン押下時に実行して、TextViewに表示します。バックスタック取得BackStackの数が「0」と表示されました。FragmentTransaction#addメソッドとFragmentTransaction#commitAllowingStateLossメソッドを呼び出すだけでは、トランザクションはバックスタックに積まれません。バックスタックありでFragmentを追加Fragment追加時に、トランザクションをバックスタックに追加します。つのトランザクションとしてバックスタックに保存されます。ボタンを押下してバックスタックの状態を確認してみましょう。バックスタック取得BackStackの数が「1」と表示されました。FragmentTransaction#addToBackStack()でトランザクションがバックスタックに積まれたことが確認できました。バックスタックをポップするバックスタックに積み上げたトランザクションはスタックからポップすることができます。ポップすると、トランザクションを登録したFragmentの状態に戻すことができます。ポップはスタックからデータを取り出すことです。後に入れたものが先に取り出されます。supportFragmentManager.popBackStack()}重要な箇所なので、FragmentManager.javaのソースコードを読んで処理内容を理解しておきましょう。非同期でpopBackStackStateメソッドを呼び出しています。popBackStackメソッドは、popBackStackStateメソッドの上記の条件文を満たします。