[Kotlin] iOSのviewWillAppear / viewDidAppear的なことをAndroidでやるには

iOSアプリも作っているAndroidアプリエンジニアならば、viewWillAppear, viewDidAppearがAndroidでも欲しいと思うことはあると思います。viewWillAppear, viewDidAppearほどいろんな処理を置くのに便利なところはありませんよね。 Androidでもこのビューが見えそうor見えた時に何かをするということをどうやって行うかを解説します。

1. onResumeでモニターする

AndroidでいうとonResume が、viewWillAppearに当たります。iOSでviewWillAppearでやっているような仕事はここに配置できます。

ただ、これだけでは1つ問題が残ります。
まず、Activityのメインコンテントの上に違うFragmentを表示して、その状態でバックキーを押して上に乗っているFragmentをpopした時、この時にonResumeは呼ばれません。 iOSであれば上に乗っかっているViewControllerをpopすれば下のViewControllerのviewWillAppearが呼ばれます。しかし、AndroidではonResumeは呼ばれないため、viewWillAppearの目的であるビューが見えた時に何かをするという目的を100%達成できません。
例えばMainActivityから設定のFragmentを出してそこで何かの設定を編集しMainActivityに戻ってきた時に更新された設定に基づいて画面をリロードしたい場合、リロードの処理をonResumeに書いても実行されません。

2. BackStackをモニターする

このようなケースに対応する方法はBackStackをモニターすることです。 Fragmentがpopされてメイン画面に戻ってくると、バックスタックが更新されるので、これをモニターしておけばイベントを受け取ることができます。この時、メイン画面からみてバックスタックには何も残っていないので、backStackEntryCountがゼロならば、画面に戻ってきたんだな、と判定できます。

supportFragmentManager.addOnBackStackChangedListener {
    val count = supportFragmentManager.backStackEntryCount
    if (count == 0) {
        //ここでデータのリロードなどを行う。
    }
}

(上の例ではbackStackEntryCountがゼロならばという条件で判定していますが、例えばすでにaddされたFragmentからみて自画面に戻ってきた時を判定したいのであれば比較対象はゼロではなく1以上の数字になります。)

まとめ

onResumeではActivity(またはFragment)が最初に表示されたタイミング、及びバックグラウンドから復帰して表示されたタイミングの処理を入れる
BackStackChangedListenerでは自分の上に表示されたビューが取り除かれて自分が表示された時に必要な処理を入れる。
とすることにより、viewWillAppear / viewDidAppear的な処理を入れることができます。



チュートリアルの内容を自分のプロジェクトに反映させる時にわからないことや問題にぶつかった時のために、Fourhandsではオンラインのメンタリングサービスを提供しています。
ビデオチャットやスクリーン共有をつかて実際にコードをメンターに見てもらいながら問題の解決や、考え方のアドバイスがもらえるサービスですので、是非活用して見てください。
fourhands.com