Как отключить UP в Navigation для некоторого фрагмента с новым компонентом архитектуры навигации? - PullRequest
0 голосов
/ 14 мая 2018

Я пробую новый Компонент архитектуры навигации , и я не могу понять, как это сделать:

У меня есть 1 действие (MainActivity) + 3 фрагмента:

  • SplashFragment (Home)
  • MainFragment
  • SignUpFragment

Я хотел бы использовать SplashFragment, чтобы определить, следует ли мне перейти к MainFragment или SignUpFragment, но как только он достигнет любого из этих 2, вы не сможете вернуться к SplashFragment. Как я могу сделать это с новым компонентом навигации?

Я пытался popBackStack до и после вызова navigate(R.id.action_xxx), но ни один из них не работает (что имеет смысл: до того, как ему нечего выталкивать; после того, как он просто закрывает только что добавленный фрагмент). Означает ли это, что единственный способ сделать это - переопределить onBackPress для перехвата и убедиться, что navigateUp не получает вызов в этих случаях?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 03 февраля 2019

Для тех, кто хочет сделать это чисто в коде:

Navigation.findNavController(v)
.navigate(R.id.action_splashFragment_to_userProfileFragment2, null, 
new NavOptions.Builder().setPopUpTo(R.id.splashFragment, true).build())
0 голосов
/ 15 августа 2018

Это сработало для меня в выпуске alpha05.Добавьте app: popUpTo = "@ id / nav_graph" в теге action (внутри вашего файла nav_graph.xml).Здесь "@ id / nav_graph - это идентификатор моего графика или также называемый Корнем.

<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/nav_graph"
app:startDestination="@id/startFragment">
.......
<action
android:id="@+id/action_startFragment_to_homeFragment"
app:destination="@id/homeFragment" 
app:popUpTo="@id/nav_graph"/>
.......

Вы также можете сделать это на вкладке дизайна: - выберите" SplashFragment "и выберите действие, которое вы хотите изменить.а затем выберите «root» для «Pop To»

0 голосов
/ 22 августа 2018

Сначала добавьте атрибуты app:popUpTo='your_nav_graph_id' и app:popUpToInclusive="true" к тегу действия.

<fragment
    android:id="@+id/signInFragment"
    android:name="com.glee.incog2.android.fragment.SignInFragment"
    android:label="fragment_sign_in"
    tools:layout="@layout/fragment_sign_in" >
    <action
        android:id="@+id/action_signInFragment_to_usersFragment"
        app:destination="@id/usersFragment"
        app:launchSingleTop="true"
        app:popUpTo="@+id/main_nav_graph"
        app:popUpToInclusive="true" />
</fragment>

Затем перейдите к месту назначения, используя вышеуказанное действие в качестве параметра.

findNavController(fragment).navigate(SignInFragmentDirections.actionSignInFragmentToUserNameFragment())

ПРИМЕЧАНИЕ : если вы используете метод navigate(@IdRes int resId), вы не получите желаемого результата.Следовательно, я использовал метод navigate(@NonNull NavDirections directions).

0 голосов
/ 14 мая 2018

ПРЕДУПРЕЖДЕНИЕ: clearTask устарело и будет удалено в следующем выпуске, не уверенный, каково решение.Пожалуйста, следуйте этой проблеме , чтобы быть в курсе


О, через 10 минут наконец-то нашли ключ: используйте clearTask.

Все, что мне нужно сделать, это добавить app:clearTask="true" к этому конкретному действию или использовать .navigate(R.id.actionXXXX, null, NavOptions.Builder().setClearTask(true).build()), и все готово.Просто убедитесь, что вы добавили его ко всем дочерним элементам SplashFragment (в данном случае и к MainFragment, и к SignUpFragment).

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