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プログラミング
- 作者:長澤 太郎
- 発売日: 2016/07/13
- メディア: 単行本(ソフトカバー)
基本からしっかり身につくAndroidアプリ開発入門 Android Studio 3対応 (「黒帯エンジニア」シリーズ)
- 作者:森 洋之
- 発売日: 2018/05/22
- メディア: 単行本