ナビゲーションコンポーネントとマルチバックスタックナビゲーション

これで、マルチモジュールプロジェクトのナビゲーションコンポーネントに関するすばらしい記事の第4部になりました。すでに知っている場合:





次に、この素​​晴らしいライブラリでの私の経験についての話の最後の部分へようこそ-iOSのようなマルチスタックナビゲーションのソリューションについて。





ここですべてがどのように機能するかを見ることができます





わからない場合は、外に出て、通常は上記の3つの記事を最初に読んでください。





ナビゲーションコンポーネントライブラリに加えて、GoogleはNavigationUIと呼ばれるいくつかのフロントエンドアドオンをリリースしました。これは、ナビゲーションをBottomBar、Menu、およびその他の標準コンポーネントに接続するのに役立ちます。ただし、多くの場合、各タブに独自のスタックがあり、タブを切り替えるときに現在の状態が保存されるという要件があります。残念ながら、箱から出して、NavigationComponentとNavigationUIはそれを行いません。





このアプローチのサポートは、GitHubのarchitecture-components-samplesリポジトリ(https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample)でGoogle自身によって提供されましたその本質は単純です:









  1. FragmentContainerを追加します。





  2. NavHostFragment .





  3. NavHostFragment FragmentManager-a.





, :





  • sign in / up flow, on boarding , , . , , .





  • . 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- .  —  , .








All Articles