Я использую методы добавления / скрытия, чтобы отображать фрагменты внутри нижней навигации с помощью навигационной компы onet
@Navigator.Name("keep_state_fragment")//`keep_state_fragment` is used in navigation xml
public class KeepStateNavigator extends FragmentNavigator {
private FragmentManager manager;
private Context context;
private int containerId;
public KeepStateNavigator(@NonNull Context context, @NonNull FragmentManager manager, int
containerId) {
super(context, manager, containerId);
this.manager = manager;
this.context = context;
this.containerId = containerId;
}
@Nullable
@Override
public NavDestination navigate(@NonNull Destination destination, @Nullable Bundle args, @Nullable
NavOptions navOptions, @Nullable Navigator.Extras navigatorExtras) {
String tag = String.valueOf(destination.getId());
FragmentTransaction transaction = manager.beginTransaction();
boolean initialNavigate = false;
Fragment currentFragment = manager.getPrimaryNavigationFragment();
if (currentFragment != null) {
transaction.hide(currentFragment);//or detach
} else {
initialNavigate = true;
}
Fragment fragment = manager.findFragmentByTag(tag);
if (fragment == null) {
String className = destination.getClassName();
fragment = manager.getFragmentFactory().instantiate(context.getClassLoader(), className);
transaction.add(containerId, fragment, tag);
} else {
transaction.show(fragment);//or attach
}
transaction.setPrimaryNavigationFragment(fragment);
transaction.setReorderingAllowed(true);
transaction.commitNow();
if (initialNavigate)
return destination;
else
return null;
}
}
и график навигации:
<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/mobile_navigation"
app:startDestination="@id/navigation_home">
<keep_state_fragment
android:id="@+id/navigation_home"
android:name="com.ikopon.ui.home.HomeFragment"
android:label="fragment_home"
tools:layout="@layout/fragment_home" />
<
<keep_state_fragment
android:id="@+id/navigation_ikopon"
android:name="com.ikopon.ui.kopon.KoponBulkListFragment"
android:label="fragment_notifications"
tools:layout="@layout/fragment_kopon_list" >
<action
android:id="@+id/action_navigation_ikopon_to_fragmentAuthentication"
app:destination="@id/fragmentAuthentication" />
</keep_state_fragment>
<keep_state_fragment
android:id="@+id/fragmentAuthentication"
android:name="com.ikopon.ui.authentication.FragmentAuthentication"
android:label="FragmentAuthentication"
tools:layout="@layout/fragment_authentication">
<action
android:id="@+id/action_fragmentAuthentication_to_navigation_ikopon"
app:popUpTo="@id/navigation_ikopon"
/>
</keep_state_fragment>
</navigation>
Проблема в моем текущем пункте назначения это всегда равно моему событию id navigation_home после перехода к другому фрагменту
Navigation.findNavController(view).getCurrentDestination().getId()
Это вызывает исключение IllegalArgumentException, когда я хочу перейти к fragmentAuthentication
Navigation.findNavController(view).navigate(R.id.action_navigation_ikopon_to_fragmentAuthentication);
IllegalArgumentException: пункт назначения xxx неизвестен к этому NavController