iOSエンジニアがAndroidアプリをリリースするまで2 〜BottomNavigationActivity 謎の隙間との格闘〜
iOSアプリでは下タブ(UITabBarController)はメジャーですが、Androidってあまり下のタブで画面を切り替えるイメージがありませんでした。
どっちかというと上のタブ。
ただ、上のタブはリスト表示の画面が複数あって、カテゴリごとに切り替えるイメージで、アプリの機能での分け方とはちょっと違うんじゃないかな〜と思ってました。
ちょっと調べたらBottomNavigationActivityというものがあって、それが機能ごとのタブ分けに使えると思い、実装しました。
そこではまったちょっとしたことと、iOSとの違いを記載します。
謎の隙間
iOSと同じように下タブベースのアプリにしようと、BottomNavigationActivityを追加。
試しにビルドしてシミュレータで動かすと、画面上部のバー(Androidだとなんて呼ぶのかまだわかってない。iOSだとナビゲーションバーのところ)とコンテンツの中に隙間が入る。。。
activity_main.xmlでnav_host_fragment(ここがタブごとのコンテンツのコンテナとなると思われる)を選択すると、確かに上は隙間が空いているし、下は下タブ(nav_view)のエリアと重なっている。
制約を見ても、topはtop of parent、bottomはtop of nav_viewとなっており、想定どおり。
解決方法
まずは、上の隙間
nav_host_fragmentの親、containerを選択。
paddingの?attr/actionBarSizeを削除!
次に、下の重なり
nav_host_fragmentを選択。
layout_heightをmatch_parentから0dp(match constraint)に変更。
これでオッケー!
でも、そもそもなぜ、このような隙間と重なりがあるんだろう。。。
iOSとの違い
iOSでUITabBarControllerを実装する場合、各タブごとにUIViewControllerを用意して、切り替えます。
各タブごとに初めて選択されたときにUIViewControllerをインスタンス化します。
Aタブ選択:UIViewControllerAを生成、表示
Bタブ選択:UIViewControllerBを生成、表示
Aタブ選択:一番初めに生成したUIViewControllerAを表示
という形で、各タブごとにUIViewControllerの生成は一度だけです。
言い換えれば、各UIViewControllerは保持された状態になります。
対してAndroid。
Androidではタブの選択で切り替わるのはActivityではなく、Fragment。
しかも、タブの選択のたびにFragmentを生成する。
Aタブ選択:FragmentAを生成、表示
Bタブ選択:FragmentBを生成、表示
Aタブ選択:FragmentAを生成、表示
なんだか無駄が多い気がする。。。
そこでViewPagerで切り替える方法!それは次にでも。。。
参考ページ
【stackoverflow】Can't remove space on top of nav_host_fragment
この記事が気に入ったらサポートをしてみませんか?