web-dev-qa-db-ja.com

フラグメントXXX {}はフラグメントマネージャーに関連付けられていません

アプリケーションでナビゲーションコンポーネントの使用を開始しましたが、次の問題に直面しています。最初のフラグメントはLoginFragmentです。ログインに成功すると、mainFragmentが表示されます。ユーザーがmainFragmentにいて、戻るボタンを押してloginFragmentに戻らないようにしたい。このため、nav_graphに次の2行を追加しました:app:popUpTo="@+id/lovable_app_navigation"およびapp:popUpToInclusive="true"とうまく機能します。これが私のナビゲーショングラフです:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:app="http://schemas.Android.com/apk/res-auto"
  xmlns:tools="http://schemas.Android.com/tools"
  Android:id="@+id/app_navigation"
  app:startDestination="@id/loginFragment">

  <fragment
    Android:id="@+id/loginFragment"
    Android:name="com.xxx.LoginFragment"
    Android:label="LoginFragment"
    tools:layout="@layout/login_fragment">
    <action
      Android:id="@+id/dashboard_action"
      app:destination="@id/mainFragment"
      app:launchSingleTop="true"
      app:popUpTo="@+id/app_navigation"
      app:popUpToInclusive="true"/>
  </fragment>

  <fragment
    Android:id="@+id/mainFragment"
    Android:name="com.xxx.MainFragment"
    Android:label="MainFragment"
    tools:layout="@layout/main_fragment">
       <action
      Android:id="@+id/logout_action"
      app:destination="@id/loginFragment"
      app:launchSingleTop="true"
      app:popUpTo="@+id/app_navigation"
      app:popUpToInclusive="true"/>
  </fragment>

  <action
    Android:id="@+id/action_global_loginFragment"
    app:destination="@id/loginFragment" />
</navigation>

問題は、しばらくすると、セッションが期限切れになったときに、ユーザーがアプリケーションのどこにいるかに関係なく、どのフラグメントで、すべてのスタックにLoginFragmentを表示する必要があるかです。このためのグローバルアクションを作成しましたaction_global_loginFragment。問題は、LoginFragmentに移動すると、次のエラーが発生することです。

Java.lang.IllegalStateException: Fragment LoginFragment{1d6bd24 (829a6832-3480-4bcb-a3f6-7e2ba214d3ca)} not associated with a fragment manager.

popUpTopopUpToInclusiveを削除すると正常に動作しますが、[戻る]ボタンの機能が影響を受け、mainFragmentからloginFragmentに戻ります。これを修正する方法はありますか?前もって感謝します。

9
Gabrielle

同じ問題が私にも起こりました。私はview?.post呼び出し内にnavigateメソッドを次のようにラップすることで解決できました:

view?.post {
    findNavController().navigate(SplashFragmentDirections.actionSplashFragmentToLoginFragment())
}
1
Joscplan