AndroidProButNo - новый участник. Будьте добры и ознакомьтесь с нашим Кодексом поведения .
Из-за сложности, присущей компоненту навигации, на этот вопрос ответить гораздо сложнее, чем кажется на первый взгляд, учитывая вам необходимо понимание компонента навигации, его использования и того, что он пытается скрыть от вас, и того, что вы не должны пытаться использовать, если вы уже используете компонент навигации.
Компонент навигации внутренне использует FragmentNavigator
, а FragmentNavigator
- это то, что выполняет действие, связанное с идентификатором destination
(R.id.destination[...]
). NavHostFragment
содержит этот навигатор, чтобы вы могли работать на основе фрагментов с помощью NavController
.
компонента навигации. Поэтому, чтобы "вернуться назад", когда вы решите использовать NavHostFragment
, нужно использовать компонент навигации, чтобы определить все пункты назначения фрагмента, действия, которые перемещаются между указанными пунктами назначения фрагмента, а затем открыть Backstack, принадлежащий NavController (который будет внутренне управлять FragmentManager).
Это выглядит примерно так
A main_activity.xml
макет
<FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
</FrameLayout>
И navigation.xml
<?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"
android:id="@+id/nav_graph"
app:startDestination="@id/blankFragment">
<fragment
android:id="@+id/firstFragment"
android:name="com.example.navigationexample.FirstFragment"
android:label="First Fragment"
tools:layout="@layout/first_fragment" >
<action
android:id="@+id/action_first_to_second"
app:destination="@id/secondFragment" />
</fragment>
<fragment
android:id="@+id/secondFragment"
android:name="com.example.navigationexample.SecondFragment"
android:label="Second Fragment"
tools:layout="@layout/second_fragment" />
</navigation>
Затем для перехода с одного экрана на другой необходимо выполнить
try {
Navigation.findNavController(view).navigate(R.id.action_first_to_second);
} catch(Exception e) {}
И чтобы вернуться, вам нужно сделать
try {
Navigation.findNavController(view).popBackstack();
} catch(Exception e) {}
И так как вы в этом случае используете компонент Navigation, вы не должны вручную управлять FragmentTransactions, потому что это сделает обратный стек компонента Navigation непоследовательным.
Теоретически, если вы сделали это правильно, то onBackPressed
уже должен правильно обрабатываться компонентом навигации, так как Я полагаю, что они регистрируются как OnBackPressedDispatcher
, и не не должны делегировать событие back вручную.