Android開発メモ (ActionBar)

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