7

情報:

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

これは、NavHostFragmentMainActivity で を作成する方法の例です。


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 の一定サイズです。スタックに追加されるのではなく、グラフに移動すると、フラグメントが置き換えられているようです。

とにかく、これを読んでくれてありがとう。

4

1 に答える 1