DeepLinkなどから遷移してBottomNavigationの初期位置を変更する時の実装メモです。
navController.navigate()
でnavigationのidを指定して実装しようとしたところ、バックスタックが積まれて端末のバックボタンを押した時に元のタブ位置に一度戻るという挙動になってしまったので少し工夫しました。
navigation/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"
app:startDestination="@+id/home">
<fragment
android:id="@+id/home"
android:name="com.konifar.HomeFragment"
android:label="@string/home_title"
tools:layout="@layout/home_fragment">
<action
android:id="@+id/action_to_favorite"
app:destination="@id/favorite" />
<action
android:id="@+id/action_to_account"
app:destination="@id/account" />
</fragment>
<fragment
android:id="@+id/favorite"
android:name="com.konifar.FavoriteFragment"
android:label="@string/favorite_title"
tools:layout="@layout/favorite_fragment" />
<fragment
android:id="@+id/account"
android:name="com.konifar.AccountFragment"
android:label="@string/account_title"
tools:layout="@layout/account_fragment" />
</navigation>
MainActivity.kt
private fun setUpBottomNavigation() {
val host = supportFragmentManager
.findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return
// 2つめのお気に入りタブを初期位置にする
val navOptions = NavOptions.Builder()
.setPopUpTo(R.id.home, true)
.build()
// ここで R.id.favorite ではなく R.id.action_to_favorite を指定する
host.navController.navigate(R.id.action_to_favorite, null, navOptions)
binding.navigation.setupWithNavController(host.navController)
}
詳しい説明はまだNavigationのコードを読めていないので読んでから書きます。
以上。