タグ付けされた質問 「android-architecture-navigation」

30
IllegalArgumentException:ナビゲーション先xxxがこのNavControllerに認識されていません
あるフラグメントから別のフラグメントに移動しようとすると、新しいAndroid Navigation Architectureコンポーネントに問題が発生し、次の奇妙なエラーが発生します。 java.lang.IllegalArgumentException: navigation destination XXX is unknown to this NavController これ以外のすべてのナビゲーションは正常に機能します。 私findNavController()はFragmentの関数を使用してにアクセスしますNavController。 どんな助けでもありがたいです。

12
Androidで別のフラグメントに移動した後にナビゲーションスタックをクリアする方法
Androidで新しいナビゲーションアーキテクチャコンポーネントを使用していますが、新しいフラグメントに移動した後、ナビゲーションスタックをクリアできません。 例:loginFragmentにいて、ホームフラグメントに移動したときにこのフラグメントをスタックからクリアして、ユーザーが[戻る]ボタンを押したときにloginFragmentに戻らないようにします。 シンプルなNavHostFragment.findNavController(Fragment).navigate(R.id.homeFragment)を使用してナビゲートしています。 現在のコード: mAuth.signInWithCredential(credential) .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment); } else { Log.w(TAG, "signInWithCredential:failure", task.getException()); } } }); navigate()でNavOptionsを使用してみましたが、戻るボタンがまだloginFragmentに戻ってきます NavOptions.Builder navBuilder = new NavOptions.Builder(); NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build(); NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);

1
Navigation Arch Componentは誤検知のメモリリークを引き起こす可能性がありますか?
メモリリークとその原因についての基本的な知識があります。そのため、コードに問題があるのか​​、それとも誤検知なのかわかりません。プロジェクトは小さくないので、コードのどの部分を共有するべきかわかりません。ただし、コメント欄でお知らせください。必要なコードを追加します。 ナビゲーションアーチコンポーネントを使用し、MVVMパターンに従います。プロジェクトの開発の後半でLeakCanaryライブラリを追加したところ、画面間を移動すると、保持されたインスタンスに関する警告がすぐに表示され始めました。 この問題は、バックスタックにフラグメントを追加すると発生します。バックスタックにフラグメントを追加するたびに、保持されるインスタンスのカウンターが増加します。LeakCanaryがしきい値の5に達すると、ヒープがダンプされ、レポートが提供されます。 しかし、[戻る]ボタンをクリックして前の画面に戻ると、保持されているインスタンスのカウンターが減少し、最終的に1番目の画面に戻ると、保持されているすべてのインスタンスが消えます。 ヒープ分析レポートを見るとCoordinatorLayout、XML内の参照である変数coordinatorLayout がリークしていることがわかります。変数とそのすべての使用法を削除してアプリを再度実行すると、同じ問題が発生しますが、別の変数がxml内の別のビューへの参照になっています。LeakCanaryがリークしていると報告したすべてのビューとその使用法を削除しようとしました。TextViewテキストを設定するためだけに使用され、onViewCreated他の場所では使用されていないがリークしていると言われたとき、コードに問題があることに疑問を感じ始めました。 ライフサイクルメソッドの呼び出しをフラグメントで分析しましたが、前のフラグメントの新しい画面に移動するonDestroyViewと、呼び出されるまでのすべてのメソッドが呼び出されますが、呼び出されませんでしたonDestroy。[戻る]をクリックするとonDestroy、バックスタックの上にあるフラグメントが呼び出され、保持されているインスタンスのカウンターが減少します。 ナビゲーションコンポーネントがフラグメントがバックスタックにあるときにフラグメントのインスタンスを保持しており、LeakCanaryがそれをリークとして認識していると思います。

1
ViewModel状態でのViewPager2 / Tabsの問題
私はMVVMパターンに従っています。つまり、フラグメントごとにViewModelがあります。 ViewPager2を使用して2つのタブを追加しました。 私のアダプターは次のようになります: @Override public Fragment createFragment(int position) { switch (position) { case 0: return new MergedItemsFragment(); case 1: return new ValidatedMergedItemsFragment(); } return new MergedItemsFragment(); } タブは機能しています。ただし、MergedItemsFragmentのViewModelの動作がおかしいことに気付きました。タブを追加する前に、次のようにFragmentに移動しました。 NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment); 私がそのフラグメントを残しNavHostFragment.findNavController(this).popBackStack()、後でそのフラグメントに戻ったとき、新しい空のViewModelを取得します。これは意図されたものです。 新しいアプローチで私はナビゲートしていreturn new MergedItemsFragment()ます。そのフラグメントを離れると、後で戻ってきて、古いデータを含む ViewModelを取得しています。ユーザーが別のフラグメントで別のデータを選択したため、古いデータは関係なくなったため、これは問題です。 アップデート#1 同じprintステートメントが複数回呼び出されるため、彼は実際にはすべての古いFragmentをメモリに保持していることに気付きました。それが呼ばれる回数は、私が去ってその画面に戻る回数とともに増加します。したがって、10回離れて戻り、デバイスを回転させると、実際には1行が10回実行されます。ViewModelsで動作するように、ナビゲーションコンポーネントでTabs / ViewPagersを実装する方法を推測しますか? アップデート#2 私は私のViewModelsを次のように設定しました: viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class) 私は同じ結果を得ます: viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class); フラグメント自体にViewModelをバインドします。したがって、thisフラグメントです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.