Share
Embed
nacatl_slide_04_AAC_Navigation_Toolbar
nacatl
December 24, 2019
Transcript
40 slides
-
Copyright 2018 Studyplus, Inc. All Rights Reserved. Jetpack Navigation Toolbarのいろいろ
Yuzuru Nakashima / Studyplus Inc. 2019.12.24 @ あるあるLT Vol.09 -
自己紹介 ✎ なかてぃる affinity_robots nacatl ✎ スタディプラスのAndroidエンジニア ✎ 趣味: Magic
the Gathering ✎ DroidKaigi2020登壇します! -
アジェンダ ✎ Jetpack Navigation ライブラリ ✎ Toolbar.setupWithNavController ✎ onDestinationChangedListener ✎
ViewModel経由 ✎ Toolbar in Fragment ✎ まとめ -
Toolbar.setupWithNavController - ToolbarをNavigationで管理する拡張関数 - ラベル文字列をNavGraphで指定できる - 「←」ボタン表示有無 - バックスタックない時の「←」挙動の管理 -
AppCompatActivity.setupWithActionBar WithNavControllerもあるけどまた今度 (DrawerNavigationと連携とかできる) -
Toolbar.setupWithNavController fun Toolbar.setupWithNavController( navController: NavController, configuration: AppBarConfiguration = AppBarConfiguration(navController.graph) )
{ NavigationUI.setupWithNavController( this, navController, configuration ) } -
Toolbar.setupWithNavController fun Toolbar.setupWithNavController( navController: NavController, configuration: AppBarConfiguration = AppBarConfiguration(navController.graph) )
{ NavigationUI.setupWithNavController( this, navController, configuration ) } このコンフィグで色々設定する -
Toolbar.setupWithNavController val navController = findNavController(R.id.nav_host_fragment) // TopLevelDestinationのSetを指定 val idSet =
mutableSetOf<Int>() navController.graph.iterator() .forEach { idSet.add(it.id) } findViewById<Toolbar>(R.id.toolbar) .setupWithNavController( navController, AppBarConfiguration.Builder(idSet).build() ) -
Toolbar.setupWithNavController val navController = findNavController(R.id.nav_host_fragment) // TopLevelDestinationのSetを指定(全部) val idSet =
mutableSetOf<Int>() navController.graph.iterator() .forEach { idSet.add(it.id) } findViewById<Toolbar>(R.id.toolbar) .setupWithNavController( navController, AppBarConfiguration.Builder(idSet).build() ) graphにあるも の全部 add -
Toolbar.setupWithNavController - Tips. ドロワーの場合ハンバーガー出るらしい // androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener boolean isTopLevelDestination = NavigationUI
.matchDestinations( destination, mTopLevelDestinations ); if (drawerLayout == null && isTopLevelDestination) { setNavigationIcon(null, 0); } else { setActionBarUpIndicator( drawerLayout != null && isTopLevelDestination ); } -
onDestinationChangedListener // toolbar設定 setSupportActionBar(toolbar) supportActionBar?.let { it.setDisplayHomeAsUpEnabled(true) it.setHomeButtonEnabled(true) } //
addOnDestinationChangedListener navController.addOnDestinationChangedListener { controller, destination, arguments -> supportActionBar?.title = destination.label // when(destination.id)でOptionMenu管理とか } -
ViewModel経由でLiveData Observe a liveData that is set value when a
Fragment is created. -
ViewModel経由でLiveData // 従来の設定 setSupportActionBar(toolbar) supportActionBar?.let { it.setDisplayHomeAsUpEnabled(true) it.setHomeButtonEnabled(true) } //
LiveDataのObserverで変更 viewModel.titleText.observe(this) { title -> supportActionBar?.title = title } -
Toolbar in Fragment - Toolbarを各Fragmentのレイアウトで持つ - 個別に細かいカスタマイズがあるなら - OptionMenuの中身が細かく切り替わる -
「←」じゃなく「×」ボタン付けたい - デザイン的カスタマイズ -
- NavigationライブラリはGoogleの ドクトリンに沿って開発されている https://developer.android.com/guide/navigation/navigation-principles?hl=ja#u p_and_back_are_identical_within_your_apps_task(再喝) - 私見: できる限りNavigationに乗っかりたい (Toolbar.setupWithNavController) (OnDestinationChangedListener)
(AppCompatActivity .setupActionBarWithNavController) -
追加資料 - バックスタックない時の根拠(2.2.0-rc04の内部コード ) // androidx.navigation.ui.AppBarConfiguration /** * The {@link
OnNavigateUpListener} that should be invoked if * {@link androidx.navigation.NavController#navigateUp} returns <code>false</code>. * @return a {@link OnNavigateUpListener} for providing custom up navigation logic, * if one was set. */ @Nullable public OnNavigateUpListener getFallbackOnNavigateUpListener() { return mFallbackOnNavigateUpListener; }