Идентификатор пункта назначения навигации всегда один и тот же, если использовать добавление / скрытие для отображения фрагментов - PullRequest
0 голосов
/ 05 мая 2020

Я использую методы добавления / скрытия, чтобы отображать фрагменты внутри нижней навигации с помощью навигационной компы 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...