Android Architecture ComponentsのNavigation Component、少ないコードでDrawerの実装ができて便利です。ただし、少し前まではルートの要素をひとつしか持てないという成約がありました。
【参考記事】
https://www.slideshare.net/yasi_life/navigationui
1.0.0-alpha07にて、ついに複数のルート要素に対応したので対応方法をメモとして残しておきます。基本的な利用方法は他にも多数記事があるので差分箇所のみ。
導入
1.0.0-alpha07が必要なのでgradleの設定を修正します。
build.gradle
dependencies {
implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha07'
implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0-alpha07'
}
NavControllerの設定
ポイントは、ルート要素のFragmentを引数に列挙したAppBarConfiguration
を生成し、Toolbarに対してsetupWithNavController
を実行する際に第2引数でそれを渡してあげる点です。Data Bindingを使ったサンプルになります。
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
navController = findNavController(R.id.nav_host_fragment)
val appBarConfig = AppBarConfiguration(setOf(
R.id.fragment_root_a,
R.id.fragment_root_b,
R.id.fragment_root_c
), binding.drawerLayout)
binding.toolbar.setupWithNavController(navController, appBarConfig)
binding.navDrawer.setupWithNavController(navController)
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp() || super.onSupportNavigateUp()
}
}
参考までにlayoutファイルもサンプルを載せておきます。
layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
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">
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</com.google.android.material.appbar.AppBarLayout>
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/nav_drawer"/>
</androidx.drawerlayout.widget.DrawerLayout>
</layout>
参考URL