AndroidのNavigationViewを導入する方法です。

UIの動きとしては、google play(2017/5/4現在)で見られるようなこんなUIのことです。

今回は、BottomNavigationViewとtoolbarも導入しています。
まずは、BottomNavigationViewを定義したxmlファイルを見ます。

NavigationViewをレイアウトファイルに定義する際は、少し特殊な書き方になります。
今回は、xmlファイルにdatabindingも導入しているので、xmlファイルの一番上に<layout>タグを記入しています。

その次に<DrawerLayout>タグを定義し、FrameLayoutのContents領域、最後に<NavigationView>を挿入しています。

<NavigationView>タグに

app:headerLayout=”@layout/nav_header_main”
app:menu=”@menu/activity_main_drawer”

を定義しています。
これらは、ぞれぞれheaderのレイアウトファイルを定義する。
menuのレイアウトファイルを定義する意味になります。

これらは、もちろんプログラム上からも作成できますが、今回はxmlファイルから生成します。

では、NavigationViewのheaderの参照xmlファイルを見ていきます。

NavigationViewのheaderのレイアウトファイルnav_header_main.xmlの中身です。
中身として、ImageViewをセットしています。
headerのimageは以下のようになります。

NavigationView Header画像

画像は、android6.0で実行したものですが、見てわかるように、navigation headerのheightの開始位置がステータスバー始点になっているため、ImageViewで設定したアイコンがステータスバーにかぶってしまっています。

androidのversionによってthemeが異なるために、NavigationViewのY座標の開始点が異なります。
なので、versionごとにStylesの設定をわけるなどの分岐処理が必要になります。

例えば、androidの4.1.1で実行した場合は、以下のようになります。

NavigationView android4系

この場合は、ステータスバーとアイコンがかぶっていません。
このように表示が異なるためandroidのversionごとに対応する必要があります。

続いて、表示させるmenuを見ていきます。

NavigationViewのmenu設定

iconとタイトルのみを設定した単純なレイアウトです。

続いて、プログラム側を見ていきます。

NavigationMenuプログラム側の実装

設定するActivityのonCreateなどで、以下のように設定します。

(1)でDrawerの設定をしています。
コンストラクタでは、連携させるActivityやtoolbarのインスタンスなどを渡しています。
そのまま、関数に飛ぶとjavadogに説明が書かれています。

続いて、NavigationViewをタップした際の処理を見ていきます。

ActivityにNavigationView.OnNavigationItemSelectedListenerをimplementし、
onCreate上で、リスナーの設定をしています。

中身は単純で、xmlで設定したidで分岐し、タップされた際の処理をしているだけです。