そうだ、Android アプリを作ろう~準備編~3 Fragmentたちを観察する
前回の記事(そうだ、Android アプリを作ろう~準備編~2 MainActivityを観察する)でMainActivityの観察やActivityのライフサイクルについてのオベンキョウを行った。今回は、アプリのひな型にあるFirstFragmentとSecondFragmentについて同様に観察とオベンキョウをやっていこう。
基本はログ取りから
前々回の記事(そうだ、Android アプリを作ろう~準備編~いざログ取り大作戦)のようにログをもとにしたリサーチから始めてみる。やり方はそちらの記事を参照してほしい。雷に撃たれたように突如ソースコードを理解できた、という人は、地道で地味なこの過程は読み飛ばしてもらっても大丈夫。
ちなみに、FistFragmentとSecondFragmentは中身はほぼ同じなので、ログを仕込む際はどちらか一方で良い。ログを仕込むとは、ログ出力の準備をする際に良く用いる表現だ(主に私が)。
ログから見えてきたもの
FirstFragment.javaに入れたログを見ると、それぞれのメソッドが以下のタイミングでコールされていることが分かった。
onCreateView() → First Fragment画面が表示されたとき
onViewCreated() → 上に同じく
onClick() → 「NEXT」ボタンを押された時
onDestroyView() → 上に同じく
前回記事のActivityと似ていて、表示された時とか、表示をやめた時(=「NEXT」ボタンを押したとき)にコールされている。そこから、もしかするとこれはライフサイクルが関係しているのでは? と予想できる(と、やや強引に都合の良い展開に持っていく。そんなライティングテクニックもnoteには必要だろう)。
Fragmentのライフサイクル
前回の記事で「アプリの状態が変わるときにコールされるメソッドがありますよ」という、Activityのライフサイクルの話を書いた。デベロッパーサイトを見ると、Fragmentにもライフサイクルがあり、以下の図のようになっている。デベロッパーサイトと実際の動作から、ひな形アプリのコードにあるonCreateView()がFragmentが表示されるとき、onDestroyView()は表示が終了するときにコールされることが分かった。
onViewCreated()はこの図には無いが、ネットで調べるとonCreateView()の次にコールされると書いてあり、実際にログを見てもそうなっていた。あまり自分でメソッドを自作しなくても、この流れに任せておけばある程度どうにかなるようだ。
onClick()の中身を見てみよう
onClick()はライフサイクルに無く、「ボタンが押された時にこう動かすぜ」を自分で能動的にコントロールする仕組みだ。ソースコードは以下のようになっている。
binding.buttonFirst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e(TAG, "onClick() call");
NavHostFragment.findNavController(FirstFragment.this)
.navigate(R.id.action_FirstFragment_to_SecondFragment);
}
何も分からなくても、FirstFragment_to_SecondFragmentという言葉があるので、文字通りFirstFragmentを表示した状態から、SecondFragmentを表示した状態へ移行するための処理が行われていることが分かる。なるほど、確かにその通りの動きになっている。この動きに関しては、今後実際に変更を入れながら学んでみたい。
ActivityとFragmentとは何だったのか
ここまでActivityとFragmentを観察してみて、これらが表示に関係していることが分かった。MainActivityという土台に、Fragmentが乗っているイメージだ。
デベロッパーサイトの記載からも、FragmentはActivityの子分的な役割らしいことが分かる。このひな形アプリではNEXTボタンを押すことでFistrFragmentとSecondFragmentの表示を切り替えているけれども、2つ並べて表示させるなど、多彩なバリエーションの表示が可能なようだ。Androidアプリで画面を作るときはどんなActivityとFragmentで作ろうかな、と考えてみるのが良いらしい。
よく分からないライフサイクルもあるし、Fragmentを切り替える仕組みも謎だしで、まだまだ不思議が詰まっているAndroidアプリ。次回からはソースコードを変更しつつ、楽しく遊んでみたいと思う。