AndroidはJetpack Navigationコンポーネントが前のFragmentに戻ったときにonCreateView、onView Createdメソッドを再実行する問題を解決します.


navigate()メソッドを使用して他のFragmentをスキップし、navigateUp()のFragmentをスタックして前のインタフェースに戻ると、前のインタフェースのonCreateViewとonView Created()ライフサイクルメソッドが再実行され、Viewとデータの初期化コードロジックが再実行され、戻るたびにページがリフレッシュされます.また、前のページで初期化ロジックが多い場合は、戻るときに明らかなカートンが発生する可能性があります.
質問シーン:プロジェクト内のfragmentAインタフェースのデータ初期化操作は、怠惰ロードメソッドで実行され、fragmentBインタフェースをジャンプして戻ると、AfragmentインタフェースonView Createdはビューを再実行して再初期化されますが、データ初期化は怠惰ロードメソッドで1回のみ実行され、前のfragmentインタフェースが空白になります.また、公式に与えられたSunflower Demoでも検証しましたが、同じように戻ると前のfragmentページが再表示されます.
問題の原因:Navigationグループが別のFragmentをジャンプする場合、navigate()メソッドのソースコードにはft.replace()方式が使用され、add()hide()show()ではなく、fragmentBがfragmentAを上書きし、戻るときにfragmentAが再Createされることもあります.
public NavDestination navigate(@NonNull Destination destination, @Nullable Bundle args,
            @Nullable NavOptions navOptions, @Nullable Navigator.Extras navigatorExtras) {

// ...  
    ft.replace(mContainerId, frag);
    ft.setPrimaryNavigationFragment(frag);

// ...  
}

解決方法:NavHostFragment、FragmentNavigatorクラスをプロジェクトにコピーし、FragmentNavigatorのnavitgate()メソッドを変更し、NavHostFragmentのimport FragmentNavigatorのパスを変更します.
public NavDestination navigate(@NonNull Destination destination, @Nullable Bundle args,
            @Nullable NavOptions navOptions, @Nullable Navigator.Extras navigatorExtras) {

// ...  
    if(mFragmentManager.getFragments().size()>0){                          
    ft.hide(mFragmentManager.getFragments().get(mFragmentManager.getFragments().size()-1));
            ft.add(mContainerId, frag);
    }else {
            ft.replace(mContainerId, frag);
    }
//      ft.replace(mContainerId, frag);
    ft.setPrimaryNavigationFragment(frag);

// ...  
}

同時にNavHostの設定時にNavHostFragmentを使用する.findNavController(this).navigate(actionId,args)メソッドジャンプの場合、ガイドパッケージはプロジェクト内のNavHostFragmentを使用します.