web-dev-qa-db-ja.com

Jetpackナビゲーション:NavHostManagerはFragmentManagerのアクティブなフラグメントではありません

私はフラグメントのナビゲーションを処理するためにJetpack Navigationを使用しています。
ドキュメントに従って、必要なコンポーネントをインストールしましたが、NavHostフラグメントをホストしているアクティビティを表示しようとすると、アプリがクラッシュします

例外:

Java.lang.IllegalArgumentException: Fragment NavHostFragment{820022f} is not an active fragment of FragmentManager FragmentManager{5a5703c in HostCallbacks{a0b41c5}}
        at Android.support.v4.app.FragmentManagerImpl.setPrimaryNavigationFragment(FragmentManager.Java:3389)
        at Android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.Java:783)
        at Android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.Java:2595)
        at Android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.Java:2382)
        at Android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.Java:2337)
        at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:2244)

メインアクティビティレイアウト

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".LoginActivity" >

    <fragment
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:id="@+id/my_nav_Host_fragment"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/nav_graph"
        app:defaultNavHost="true"
        />
</FrameLayout>

メインアクティビティ-Kotlin

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.login_activity)
        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                    .replace(R.id.container, LoginFragment.newInstance())
                    .commitNow()
        }
    }

    override fun onSupportNavigateUp()
        = findNavController(R.id.my_nav_Host_fragment).navigateUp()

}

JetPackの機能をテストしようとしていますが、現在この機能にこだわっています。何が問題なのか手掛かりがありますか? Android 3.2がまだプレビュー段階にあるためですか?)何か助けていただければ幸いです。

11
sallah kokaina

解決しました。

問題は、FragmentManagerを呼び出してコンテンツをLoginFragmentの新しいインスタンスに置き換えることから発生しました。onCreateメソッドから次のコードを削除するだけで解決しました

if (savedInstanceState == null) {
    supportFragmentManager.beginTransaction()
            .replace(R.id.container, LoginFragment.newInstance())
            .commitNow()
}
17
sallah kokaina

これは私が数分間頭を悩ませる原因となったので、追加の説明:

OPの投稿からのコードを使用してプログラムでNavHostFragmentを作成し、答えることができますorapp:defaultNavHost="true"をメインアクティビティのフラグメントに挿入します。

Android Studioは、スタブファイルを作成するときにこれらの方法の両方を作成します。 OPのコードまたはそのプロパティを削除すると、OPが機能します。

1
IsiSku