情報:
NavHostFragment
アプリの for each 機能をプログラムで挿入しています。それぞれNavHostFragment
に独自のナビゲーション グラフがあります。ダガーは、FragmentFactory
各機能に固有のものを使用してそれらを提供しています。これは、MVVM アーキテクチャを使用した単一アクティビティ構造です。
レポ: https://github.com/mitchtabian/DaggerMultiFeature/tree/nav-component-backstack-bug
ブランチ「nav-component-backstack-bug」をチェックアウトします。
問題
グラフに移動すると、フラグメントがバックスタックに追加されません。追加される唯一のフラグメントは、最近アクセスされたフラグメントです。したがって、スタック サイズは常に 1 のままです。
FragmentFactory
もともと を に設定していなかったからだと思っていましたChildFragmentManager
が、何も変わりません。関連するコードについては、以下のコード スニペットを参照してください。または、プロジェクトをチェックアウトして実行します。と から現在バックスタックにあるフラグメントを出力するログがChildFragmentManager
ありSupportFragmentManager
ます。両方とも 1 の定数サイズを持ちます。
Feature1NavHostFragment.kt
カスタムNavHostFragment
の一つです。create()
コンパニオン オブジェクトの機能は、それらを作成する方法です。
class Feature1NavHostFragment
@Inject
constructor(
private val feature1FragmentFactory: Feature1FragmentFactory
): NavHostFragment(){
override fun onAttach(context: Context) {
((activity?.application) as BaseApplication)
.getAppComponent()
.feature1Component()
.create()
.inject(this)
childFragmentManager.fragmentFactory = feature1FragmentFactory
super.onAttach(context)
}
companion object{
const val KEY_GRAPH_ID = "android-support-nav:fragment:graphId"
@JvmStatic
fun create(
feature1FragmentFactory: Feature1FragmentFactory,
@NavigationRes graphId: Int = 0
): Feature1NavHostFragment{
var bundle: Bundle? = null
if(graphId != 0){
bundle = Bundle()
bundle.putInt(KEY_GRAPH_ID, graphId)
}
val result = Feature1NavHostFragment(feature1FragmentFactory)
if(bundle != null){
result.arguments = bundle
}
return result
}
}
}
MainActivity.kt
これは、NavHostFragment
MainActivity で を作成する方法の例です。
val newNavHostFragment = Feature1NavHostFragment.create(
getFeature1FragmentFactory(),
graphId
)
supportFragmentManager.beginTransaction()
.replace(
R.id.main_nav_host_container,
newNavHostFragment,
getString(R.string.NavHostFragmentTag)
)
.setPrimaryNavigationFragment(newNavHostFragment)
.commit()
Feature1MainFragment.kt
これは、グラフ内の他のフラグメントに移動する方法の例です。
btn_go_next.setOnClickListener {
findNavController().navigate(R.id.action_feature1MainFragment_to_feature1NextFragment)
}
概要
私が言ったように、すべてのフラグメントで、ChildFragmentManager
と の両方のバックスタックを出力していSupportFragmentManager
ます。両方とも 1 の一定サイズです。スタックに追加されるのではなく、グラフに移動すると、フラグメントが置き換えられているようです。
とにかく、これを読んでくれてありがとう。