Как вернуться к предыдущему фрагменту, нажав назад? - PullRequest
0 голосов
/ 24 февраля 2020

Я работаю с Навигационным Ящиком для навигации по множеству разных фрагментов. В некоторых случаях некоторые фрагменты помещаются поверх других фрагментов. Однако, когда я нажимаю кнопку «Назад», чтобы вернуться к предыдущему фрагменту, он возвращается к исходному фрагменту.

MapFragment. java

img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction fr = getFragmentManager().beginTransaction();
                fr.replace(R.id.navHostFragment, new ImgMapFragment()).addToBackStack(null);
                fr.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                fr.addToBackStack(null);
                fr.commit();

Как сделать так, чтобы при открытии ImgMapFragment я мог вернуться к предыдущему фрагменту, в котором находился, вместо HomeFragment

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

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 вручную.

0 голосов
/ 24 февраля 2020

Посмотрите на getFragmentManager().popBackStack() методы (есть несколько на выбор)

http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack ()

...