シナリオは次のとおりです。
ルート NavGraph を持ち、デフォルトでフラグメント A をロードするメイン アクティビティがあります。フラグメント A からフラグメント B に移動し、その中に子フラグメントと TabLayout がある場合、ユーザーはその内部でフラグメントを切り替えることができます。そのために、フラグメント B 内の子フラグメントの新しいネストされたグラフを作成しました。 A から Fragment B まで、子 Fragment 内に Fragment C を表示できます。これは、ネストされた Graph で Start Destination を Fragment C として設定したためです。
***root Navigation Graph***
<?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/navigation_graph"
app:startDestination="@id/fragmentC">
<fragment
android:id="@+id/FragmentA"
android:name="com.myapp.fragment.FragmentA"
android:label="Fragment A"
tools:layout="@layout/fragment_A">
<action
android:id="@+id/action_fragmentA_to_fragmentB"
app:destination="@id/fragmentB" />
</fragment>
<fragment
android:id="@+id/fragmentB"
android:name="com.myapp.fragment.FragmentB"
android:label="FragmentB"
tools:layout="@layout/fragment_B">
<action
android:id="@+id/action_fragmentB_to_second_graph"
app:destination="@id/navigation_graph2" />
</fragment>
<include app:graph="@navigation/navigation_graph2" />
</navigation>
***Nested Navigation Graph***
<?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/navigation_graph2"
app:startDestination="@id/FragmentC">
<fragment android:id="@+id/FragmentC"
android:name="com.myapp.fragment.FragmentC"
android:label="Fragment C"
tools:layout="@layout/fragment_C">
<action
android:id="@+id/action_fragmentC_fragmentD"
app:destination="@id/FragmentD" />
</fragment>
<fragment android:id="@+id/FragmentD"
android:name="com.myapp.fragment.FragmentD"
android:label="Fragment D"
tools:layout="@layout/fragment_D">
<action
android:id="@+id/action_fragmentD_fragmentC"
app:destination="@id/FragmentC" />
</fragment>
</navigation>
***Inside Fragment B***
public class FragmentB extends BaseFragment<FragmentAssignmentsBinding>
implements TabLayout.OnTabSelectedListener{
NavController nestedNavController;
@Override
public int getLayoutId() {
return R.layout.fragment_assignments;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
if(getFragmentDataBinding()==null)
return;
nestedNavController = Navigation.findNavController(view);
getFragmentDataBinding().myTabLayout.addOnTabSelectedListener(this);
}
@Override
public void onTabSelected(TabLayout.Tab tab) {
switch (tab.getPosition()) {
case 0:
//***Here how to handle the nested graph Fragment Action ?***
nestedNavController.navigate(R.id. action_fragmentC_fragmentD);
break;
case 1:
nestedNavController.navigate(R.id. action_fragmentD_fragmentC);
break;
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
}
今問題は - > onClicking Tab A または Tab B from parentFragment( Fragment B) 、ネストされた NavGraph アクションにアクセスして、parentFragment 内のフラグメントを置き換える必要があります。しかし、エラーに遭遇します:-
java.lang.IllegalArgumentException: ナビゲーション先 com.myapp:id/action_fragmentC_fragmentD がこの NavController に認識されていません
ヘルプやガイダンスは本当に役に立ちます。