しょーさのブログ

不定期で何か書く。多分。

【Android】Fragment同士の遷移とActivityへの通知の実装メモ

今の仕事で作っているAndroidアプリのUIは基本的に
機能毎にActivityを作って、その上にFragmentをAttachしている。

で、その機能の範囲内で画面遷移する時はFragmentを切り替える設計になっているわけだが、
その辺りを実現するためにFragmentを操作するライブラリをベースに独自クラスと拡張関数を作っている。

ただ、自分自身はActivity・Fragment制御の根本的な仕組みを理解している訳ではなかったので、
試しにライブラリを使わずにFragment同士の遷移を書いてみた。

やったこと

  • 初期表示でFragmentをActivityにAttach
  • Fragment同士の遷移
  • Fragmentの遷移をActivityに通知

初期表示でFragmentをActivityにAttach

参考にした記事: [Android] Activity と Fragment の画面遷移

上記記事のサンプルではActivityを初期表示にボタンクリックでFragmentを表示する実装になっているが、
UIの表示ロジックはFragmentに書いて、ActivityにはToolbarのロジックなどを書く様にしたかったので、
最初からFragmentをAttachする実装にした。

具体的なコードはこんな感じ。

feat:ActivityにFragmentをAttach · syo-sa1982/ToDo4Android@b2721b7 · GitHub

因みにDataBinding使いたかったので、UIの表示方法は元の記事と若干違う。
それと、あとから気がついたけどタイポが混じっている。(誤: frammentTransaction 正: fragmentTransaction)

Fragment同士の遷移

参考にした記事:[Android] Fragment から別の Fragment に画面遷移させてみる

次はFragmentから別のFragmentへの遷移。 尚、次のFragmentに遷移してから前のFragmentに「遷移し直す」ケースは全く想定していなくて、
前のFragment(というか画面?)に「戻る」実装しかしていない。

ここまでで画面の見た目としては下記のようになっている。

遷移前 遷移後
f:id:syo-sa19820615:20190104194231p:plain f:id:syo-sa19820615:20190104194327p:plain

Fragmentの遷移をActivityに通知

参考にした記事: FragmentからActivityにコールバックする方法2017 - Qiita

ここまでToolbar(画面スクショでいうと、ヘッダーみたいな部分)には特に何も表示させていなかったが、
表示しているFragmentによってToolbarに表示させる内容を切り替えたい。

が、Toolbar自体はActivityで持っている為、FragmentのAttachや遷移をActivityに通知する必要がある。
なので、以下のような方法を取った。

  • AppCompatActivity/FragmentのBaseクラス(BaseActivity/BaseFragment)を作る
    • BaseFragmentには遷移を通知するinterfaceを定義
    • BaseActivityには前述のinterfaceをimplementして、Toolbarを書き換える処理を実装

具体的にはこんなコードになる
feat:Toolbarの表示をFragmentの遷移にあわせる · syo-sa1982/ToDo4Android@f1ac9aa · GitHub

見た目はこうなる

遷移前 遷移後
f:id:syo-sa19820615:20190105130216p:plain f:id:syo-sa19820615:20190105132219p:plain

最後に

ここまで実務で使っているライブラリを使わずになるべく最小限のクラスで実装してみたものの、
RequestCodeを送るケースや遷移のアニメーションを指定するケースなどが有るので、
Fragmentの遷移制御を担う独自クラスを作って拡張関数を作る必要はやはり出てくるなと感じた。

気が向いたら、次回以降リファクタリングしたコードを書くか、この記事に追記するなどしてみる。