見出し画像

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となっており、想定どおり。

スクリーンショット 2020-08-18 10.56.27

解決方法

まずは、上の隙間
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


前の記事
iOSエンジニアがAndroidアプリをリリースするまで1 〜きっかけ〜

この記事が気に入ったらサポートをしてみませんか?