Androidアプリの上部にはアクションバーがある。
最初はAppBarと呼ばれるものがあった。より便利なActionBarがAndroid3.0から導入された。そしてMaterialUIでActionBarをもっと精密に制御するためにToolBarとして独立した。
ActionBarはActivityが管理している。Activity.OnCreateOptionMenu()
をオーバーロードして、res/menu/my_menu.xml
をinflateすると、ActionBarの右上に「…」が表示されて、いい感じメニューを用意してくれる。簡単なタスクには便利。
fragmentはActionBarを持たないが、onCreate()
でsetHasOptionsMenu(true)
を指定すれば、onCreateOptionsMenu()
が呼び出される。動的で色々したい場合はonPrepareOptionsMenu
とかinvalidateOptionsMenu
を使う。ちょっとそこまでまだ触れてない。
http://developer.android.com/guide/topics/ui/menus.html#options-menu
アクションバーはsupportActionBar.hide()
で隠してもいいし、themeで<item
name="windowNoTitle">false</item>
でActionBar自体を無くしてもよい。やっぱり欲しくなったらsetSupportActionBar(view)
で設定してからshow()
する。
android.support.v4.app.FragmentActivity
を使う場合はgetActionBar
で取得するが、今はandroid.support.v7.app.AppCompatActivity
を使うことが多いと思うので忘れてよい。
ActionBarはActivityに紐づくので、Fragment1からFragment2にアニメーション遷移するときActionBarは上部に固定されたままにできる。これが標準の仕様だが、単一のActionBarを複数のFragmentで操作するのはできれば避けたい。各Fragmentが独自にToolBarを管理する方がよっぽど分かりやすいからだ。うまく書く方法は現在調査中。
Fragment毎にToolBarを持たせると、FragmentのアニメーションにToolBarが巻き込まれる問題が発生する。これは仕方がない。例えばToolBarがあるFragmentとないFramentの画面を遷移するときはどう遷移すべきだろうか。ToolBarを上部に固定したいときだけ、Fragmentの中にFragmentContainerを作って子Fragmentを遷移させる方法がある。下のリンク先にあるように、"Toolbar is too fluid to generalize it across fragments."なのだ。 https://www.reddit.com/r/androiddev/comments/j06ku1/how_to_have_different_toolbar_in_activity_for/
余談だが、Fragment間の遷移に関してはMaterialContainerTransformは参考になるかもしれない。 https://material.io/develop/android/theming/motion