AndroidはJetpack Navigationコンポーネントが前のFragmentに戻ったときにonCreateView、onView Createdメソッドを再実行する問題を解決します.
1828 ワード
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されることもあります.
解決方法:NavHostFragment、FragmentNavigatorクラスをプロジェクトにコピーし、FragmentNavigatorのnavitgate()メソッドを変更し、NavHostFragmentのimport FragmentNavigatorのパスを変更します.
同時にNavHostの設定時にNavHostFragmentを使用する.findNavController(this).navigate(actionId,args)メソッドジャンプの場合、ガイドパッケージはプロジェクト内のNavHostFragmentを使用します.
質問シーン:プロジェクト内の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を使用します.