【Android】BottomNavigationView（画面下部のナビゲーションビュー）の実装（Java）

最近、独自でAndroid のアプリのコードを書いているので、それのメモ書きとして書いています。


# 「BottomNavigationView」とは？
下記画像の、赤枠の部分がそれです。
今回の記事の題名には「Java」と書いてありますが、実装方法自体は「xml」で実装します。
![ナビゲーションバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/b5204b73-9f70-d32e-a279-d3b00bde96dd.png)

# 実装
ソースコードは下記の通りです。
（各ソースの配置位置は、Andoid Studioでプロジェクトを生成した基本的な構造を想定しています。）

```xml:\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>

<!--ConstraintLayoutはデフォルトで指定されている大枠-->
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="?attr/actionBarSize">

    <!--下記が BottomNavigationView-->
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_menu" />
        <!--app:menu="@menu/~"でbottom_menu.xmlを読み込み、表示されるメニューを設定している-->
</androidx.constraintlayout.widget.ConstraintLayout>
```

「BottomNavigationView」に表示されるメニューは、下記で設定しています。

```xml:\res\menu\bottom_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <item
        android:id="@+id/navigation_alarm"
        android:icon="@drawable/baseline_alarm_on_24"
        android:title="alert" />
    <item
        android:id="@+id/navigation_calendar"
        android:icon="@drawable/baseline_calendar_today_24"
        android:title="calendar" />
    <item
        android:id="@+id/navigation_memo"
        android:icon="@drawable/baseline_mode_edit_outline_24"
        android:title="memo" />
</menu>
```

Android Studio 上での配置は、下記のようになっています。
![エクスプローラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/2241a665-f598-3ccd-c88b-04fe281a1f9e.png)

`android:icon`でデザインを設定していますが、設定しているデザインは「Google Fonts」のサイトで.xmlファイルをダウンロードしてきて、「\res\drawable\」下に格納しています。
「Google Fonts」のURLは下記の通りです。
https://fonts.google.com/icons
欲しいアイコンの「Android」を指定して「Download」することで、.xmlファイルが含まれる.zipファイルがダウンロードできます。
<img width="700" alt="アイコン_download.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/4b99aa21-7fd3-8b42-c848-ed5242624285.png">

# BottomNavigationViewのイベント処理
ここでやっと、Javaの話になります。
実装方法は、下記の通りです。

```java:\java\com\example\プロジェクト名\MainActivity.java
package com.example.プロジェクト名;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // BottomNavigationViewのイベント設定
        setNavViewEvent()
    }

    /**
     * BottomNavigationViewのイベント設定
     */
    private void setNavViewEvent(){
        BottomNavigationView navView = findViewById(R.id.nav_view);
        navView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                // switch()文でイベント分岐
                // item.getItemId()で、各メニューに設定した「id」を取得できる
                switch (item.getItemId()){
                    case R.id.navigation_alarm:
                        break;
                    case R.id.navigation_memo:
                        break;
                    //........................
                    default:
                        break;
                }
                return false;
            }
        });
    }
}
```
javaのandroidにおいての、他のイベント設定の方法と同じで、コントロールに対して、`On~Listener`を設定することで、イベントを実装できます。
`onNavigationItemSelected()`は、`NavigationBarView`の選択内容が変更されたときに発生する処理なので、`NavigationBarView`に含まれる`item`の`id`を使用して、`switch()`文で処理を分岐します。

# 終わりに
今回は、`BottomNavigationView`に関して、ということで記事を書きましたが、これ自体は他の方が書かれた記事もあるので、特に珍しくないかと思います。（JavaではなくKotlinということもありましたが）
今作成しているアプリに関係して、また書くことがあれば、その都度書いていこうかと思います。
また、作成中のアプリが完成したら、作成したアプリについての記事も書こうかと思います。
（途中で面倒くさくなって、放置しなければですが(笑)）