【Kotlin/Android】Fragment間を画面遷移する方法!FragmentManagerとpopBackStack

この記事からわかること

  • Android Studio/KotlinFragment画面遷移する方法
  • parentFragmentManager使い方
  • popBackStack注意点
  • バックスタックとは?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

この記事ではFragment間を移動するために使用するparentFragmentManagerなどの使用方法を紹介していきます。実際にFragmentを作成して実装する流れは上記の記事で紹介しているので実装の流れを知りたい方は参考にしてください。

FragmentManagerとは?

公式リファレンス:FragmentManager

FragmentManagerFragmentの追加や削除、置換などをコントロールするためのクラスです。このクラスを活用することでFragmentで構成されたViewの画面遷移を実装することが可能になります。

またFragmentManagerバックスタック機能を持っています。これはトランザクションを管理する際に使用される概念であり、簡単にいうと画面遷移の履歴を保持しておき、「戻る」ボタンなどで前の状態に戻る機能を実現するためのものになります。

FragmentManagerは自身でインスタンス化するのではなくActivityFragmentメソッド(Kotlinではプロパティとして参照可能)を介してアクセスすることができるようになっています。

Activity:getSupportFragmentManager()

this.supportFragmentManager

Fragment:getParentFragmentManager()/getChildFragmentManager()

Fragmentの場合は親と子の両方のFragmentManagerを取得することが可能です。

this.parentFragmentManager
this.childFragmentManager

階層構造で見ると以下のような感じになっているようです。

【Kotlin/Android】Fragment間を画面遷移する方法!FragmentManagerとpopBackStack

ちなみに画面遷移を実装する方法としてNavigation Componentなどがありますが、こちらも内部的にFragmentManagerを使用して実装されているようです。

Fragmentを遷移する方法

FragmentManager画面を遷移(Fragmentの追加や削除、置換など)を行う方法をまとめていきます。まずは前提としてレイアウトファイルにFragmentを表示させるためのFragmentContainerViewを追加するのを忘れないようにしてください。


<androidx.fragment.app.FragmentContainerView
    android:id="@+id/main_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:elevation="10dp"/>

FragmentManagerでFragmentを操作するにはbeginTransactionメソッドを実行して最初にトランザクションを作成します。生成したトランザクションに対してFragmentの追加や置換をなどを行い、その変更を最後にコミットすることで処理が実行されます。

val fragmentManager = supportFragmentManager
// トランザクション取得
val transaction = fragmentManager.beginTransaction()
// トランザクション内の処理を実装
// 〜〜〜〜
// トランザクションをコミット
transaction.commit()

applyを使用することでもっとコンパクトに記述することも可能です。

supportFragmentManager.beginTransaction().apply {
    // トランザクション内の処理を実装
    // 最後にはコミットする
    commit()
}

Fragmentを追加する

Fragmentを追加するにはトランザクションの中でaddメソッドを使用します。引数には対象のレイアウトと表示したいFragmentインスタンスを渡します


supportFragmentManager.beginTransaction().apply {
    add(R.id.main_frame, FirstFragment())
    addToBackStack(null)
    commit()
}

Fragmentを入れ替える

Fragmentを入れ替えるにはトランザクションの中でreplaceメソッドを使用します。引数には対象のレイアウトと表示したいFragmentインスタンスを渡します


supportFragmentManager.beginTransaction().apply {
    replace(R.id.main_frame, FirstFragment())
    addToBackStack(null)
    commit()
}

Fragmentを削除する

Fragmentを削除するにはトランザクションの中でremoveメソッドを使用します。


parentFragmentManager.beginTransaction().remove(this).commit()

画面を戻る処理はこのremoveメソッドもしくは後述するpopBackStackメソッドを実行します。

バックスタックの管理・操作

FragmentManagerでバックスタックを管理・操作する方法をまとめていきます。バックスタック機能はトランザクションを管理する概念でした。トランザクション単位で履歴として保持され、戻るボタンを押下した時などは逆順にトランザクションが実行されることで前の状態に戻ることができます。

トランザクションをバックスタックに追加する

トランザクションをバックスタックに追加にはaddToBackStackメソッドを実行します。引数には必要であればトランザクションの識別子を文字列を渡すことができます。


supportFragmentManager.beginTransaction().apply {
    add(R.id.main_frame, FirstFragment())
    addToBackStack(null) // バックスタックに保存する
    commit()
}

トランザクションを戻す

トランザクションを戻す(画面を戻すなど)処理を行うにはpopBackStackメソッドを使用します。


parentFragmentManager.popBackStack()

複数画面戻りたい場合はその回数だけpopBackStackメソッドを呼び出せばOKです。


parentFragmentManager.apply {
    popBackStack()
    popBackStack()
}

addToBackStackメソッドで識別子を指定している場合はその識別子を渡すことでそのトランザクションまで戻ることが可能です。フラグにはポップ操作の挙動を制御するためのフラグを渡しますが基本的に0で問題ありません。


parentFragmentManager.apply {
    popBackStack("ActivityToFragment", 0)
}

popBackStackの注意点

popBackStackで戻った場合はFragmentのインスタンスは破棄されないようです。表示しているFragmentが不要になり、戻りたい場合removeを使用することでインスタンスを破棄することが可能です。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index