怠慢プログラマーの備忘録

怠慢でナマケモノなプログラマーの備忘録です。

【Android】BottomNavigationの選択を自前で管理する

material.io

developer.android.com

AndroidStudioからプロジェクトを作成するときに"Bottom Navigation Activity"を選択すると、上記のBottomNavigationが作成された状態でプロジェクトが作成されます。

MainActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val navView: BottomNavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)
        val appBarConfiguration = AppBarConfiguration(setOf(
            R.id.navigation_home,
            R.id.navigation_notification,
            R.id.navigation_favorite,
        ))
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
   }

}

navigation.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/mobile_navigation"
    app:startDestination="@+id/navigation_home">

    <fragment
        android:id="@+id/navigation_home"
        android:name="com.hoge.fuga.presentation.home.HomeFragment"
        android:label="@string/title_home"
        tools:layout="@layout/fragment_home"/>

    <fragment
        android:id="@+id/navigation_notification"
        android:name="com.hoge.fuga.presentation.notification.NotificationFragment"
        android:label="@string/title_notification"
        tools:layout="@layout/fragment_notification" />

    <fragment
        android:id="@+id/navigation_favorite"
        android:name="com.hoge.fuga.presentation.favorite.FavoriteFragment"
        android:label="@string/title_favorite"
        tools:layout="@layout/fragment_favorite" />


</navigation>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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">

    <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:labelVisibilityMode="labeled"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu" />

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@+id/nav_view"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />

</androidx.constraintlayout.widget.ConstraintLayout>

これでBottomNavigationのItemの選択などをよしなにしてくれます。

しかし、「いずれかのFragment内に配置されたButtonなどでBottomNavigationの他Itemに遷移したい」などの場合自前でBottomNavigationのハンドリングを行う必要がでてきます。

その場合、buttonのClickListenerなどで下記を追加。

        val navView: BottomNavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)
        navView.menu.getItem(2).setChecked(true)
        navController.navigate(navView.menu.getItem(2).itemId)

そして通常のItemの選択をハンドリングするために下記も追加。

        navView.setOnNavigationItemSelectedListener { item ->
            navController.navigate(item.itemId)
            true
        }

...あっているのか...🤔

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

  • 作者:長澤 太郎
  • 発売日: 2016/07/13
  • メディア: 単行本(ソフトカバー)