techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

BottomNavigationを使ってみる

BottomNavigationとは

MaterialDesignのサイトによるとBottomNavigationは以下のような時に使用するように書かれています。

Bottom navigation should be used for:

・Three to five top-level destinations of similar importance (alternative: a persistent navigation drawer accessible from anywhere in the app) ・Destinations requiring direct access from anywhere in the app (alternative: tabs for only one or two destinations)

最近のアップデートでYouTubeアプリがNavigationDrawer+tabからBottomNavigationに変更されています。
では、具体的な実装についてみていきましょう。

BottomNavigationを使ったActivityを追加する

導入

BottomNavigationを使ったActivityを追加するのは非常に簡単です。AndroidStudioのActivityのテンプレートにあるため、そのまま使用します。

f:id:forestsoftjpdev:20170925073104p:plain:w400

Navigationを設定する

BottomNavigationのアイテムの設定はxmlによって行います。 xmlで定義されたMenuをレイアウトに設定します。

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/title_home"/>

    <item
        android:id="@+id/navigation_dashboard"
        android:icon="@drawable/ic_dashboard_black_24dp"
        android:title="@string/title_dashboard"/>

    <item
        android:id="@+id/navigation_notifications"
        android:icon="@drawable/ic_notifications_black_24dp"
        android:title="@string/title_notifications"/>

</menu>
    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="?android:attr/windowBackground"
        app:menu="@menu/navigation"/>

f:id:forestsoftjpdev:20170925073513p:plain:w300

Navigation選択イベントのハンドリング

BottomNavigationViewにて選択イベントをハンドリングするには、OnNavigationItemSelectedListenerをセットする必要があります。OnNavigationItemSelectedListener#onNavigationItemSelected()にて、trueを返すと、Navigationが選択状態になります。

注意点としては、すでに選択状態のItemを選択したときonNavigationItemSelectedが呼ばれます。
再選択かどうかを知りたい場合は、setOnNavigationItemReselectedListener()にてOnNavigationItemReselectedListenerをセットしましょう。

これにより、onNavigationItemSelectedは最初の選択時にのみ呼ばれます。

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    mTextMessage.setText(R.string.title_home);
                    return true;
                case R.id.navigation_dashboard:
                    mTextMessage.setText(R.string.title_dashboard);
                    return true;
                case R.id.navigation_notifications:
                    mTextMessage.setText(R.string.title_notifications);
                    return true;
            }
            return false;
        }

    };
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextMessage = (TextView) findViewById(R.id.message);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    }

Activity再生成時の状態について

画面の回転などにより、Activityが再生成された場合BottomNavigationView選択状態は保持されていますがonCreateが呼ばれたタイミングでは、先頭のアイテムが選択された状態であると返してきます。onRestoreInstanceState以降に選択アイテムを取得すれば本当に選択されているItemのIDを返してくれます。

参考

https://material.io/guidelines/components/bottom-navigation.html https://developer.android.com/reference/android/support/design/widget/BottomNavigationView.html