これで、マルチモジュールプロジェクトのナビゲーションコンポーネントに関するすばらしい記事の第4部になりました。すでに知っている場合:
次に、この素晴らしいライブラリでの私の経験についての話の最後の部分へようこそ-iOSのようなマルチスタックナビゲーションのソリューションについて。
わからない場合は、外に出て、通常は上記の3つの記事を最初に読んでください。
ナビゲーションコンポーネントライブラリに加えて、GoogleはNavigationUIと呼ばれるいくつかのフロントエンドアドオンをリリースしました。これは、ナビゲーションをBottomBar、Menu、およびその他の標準コンポーネントに接続するのに役立ちます。ただし、多くの場合、各タブに独自のスタックがあり、タブを切り替えるときに現在の状態が保存されるという要件があります。残念ながら、箱から出して、NavigationComponentとNavigationUIはそれを行いません。
このアプローチのサポートは、GitHubのarchitecture-components-samplesリポジトリ(https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample)でGoogle自身によって提供されました。その本質は単純です:
FragmentContainerを追加します。
NavHostFragment .
NavHostFragment FragmentManager-a.
, :
. NavigationBottomBar Deep Link-. , deep link- . , — . NavigationExtensions 250 loc, lazy- NavHost-, :
/ NavHost-:
fun obtainNavHostFragment(
fragmentManager: FragmentManager,
fragmentTag: String,
navGraphId: Int,
containerId: Int
): NavHostFragment {
// If the Nav Host fragment exists, return it
val existingFragment =
fragmentManager.findFragmentByTag(fragmentTag) as NavHostFragment?
existingFragment?.let { return it }
// Otherwise, create it and return it.
val navHostFragment = NavHostFragment.create(navGraphId)
fragmentManager.beginTransaction()
.add(containerId, navHostFragment, fragmentTag)
.commitNow()
return navHostFragment
}
NavHost-:
protected fun selectTab(tab: Tab) {
val newFragment = obtainNavHostFragment(
childFragmentManager,
getFragmentTag(tabs.indexOf(tab)),
tab.graphId,
containerId
)
val fTrans = childFragmentManager.beginTransaction()
with(fTrans) {
if (selectedFragment != null) detach(selectedFragment!!)
attach(newFragment)
commitNow()
}
selectedFragment = newFragment
currentNavController = selectedFragment!!.navController
tabSelected(tab)
}
“Back”:
activity?.onBackPressedDispatcher?.addCallback(
viewLifecycleOwner,
object: OnBackPressedCallback(true){
override fun handleOnBackPressed() {
val isNavigatedUp = currentNavController.navigateUp()
if(isNavigatedUp){
return
}else{
activity?.finish()
}
}
}
)
iOS-like , lazy- . — , .