为什么Android导航组件屏幕不返回上一个Fragment,而是在preViews Fragment的onViewCreated中调用了一个方法?

问题描述 投票:0回答:1

我有两个片段调用CreateRoomFragmentDisplayPhotoFragment,导航图如下所示:

<navigation>    
<fragment
    android:id="@+id/createRoomFragment"
    android:name="package.room.CreateRoomFragment"
    android:label="Create a room"
    tools:layout="@layout/fragment_create_room">
    <action
        android:id="@+id/action_createRoomFragment_to_roomFragment"
        app:destination="@id/roomFragment" />
    <action
        android:id="@+id/action_createRoomFragment_to_displayPhotoFragment"
        app:destination="@id/displayPhotoFragment" />
</fragment>

<fragment
    android:id="@+id/displayPhotoFragment"
    android:name="package.fragment.DisplayPhotoFragment"
    android:label="fragment_display_photo"
    tools:layout="@layout/fragment_display_photo" >
    <argument android:name="bitmap"
              app:argType="android.graphics.Bitmap"/>
</fragment>

因此,当我想从CreateRoomFragment移至DisplayPhotoFragment时,我使用以下方法:

NavDirections action = CreateRoomFragmentDirections.actionCreateRoomFragmentToDisplayPhotoFragment(selectedPhoto);
Navigation.findNavController(view).navigate(action);

这样做,我可以导航到DisplayPhotoFragment

但是当我按下设备的back按钮以及工具栏上的Back arrow时,它无法返回到CreateRoomFragment

我尝试过此操作,但仍无法返回上一个片段:

requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
                new OnBackPressedCallback(true) {
                    @Override
                    public void handleOnBackPressed() {

                       navController.navigateUp();  //I tried this 
                       navController.popBackStack(R.id.createRoomFragment,false); //and also this
                    }
                });

现在的主要问题:

通过使用上面的代码,屏幕没有返回到先前的片段(CreateRoomFragment)。它仍然停留在DisplayPhotoFragment中,但是同时,正在调用CreateRoomFragment onViewCreated部分中的API方法。

是什么原因造成的?以及如何解决这个问题?

android android-fragments android-navigation android-architecture-navigation android-navigation-graph
1个回答
0
投票
Android会维护一个包含您访问过的目的地的后台堆栈。当用户打开应用程序时,您的应用程序的第一个目标位于堆栈上。每次对navigate()方法的调用都会在堆栈顶部放置另一个目标。向上敲击或向后敲击分别调用NavController.navigateUp()NavController.popBackStack()方法,以从堆栈中移出(或弹出)顶部目标。
© www.soinside.com 2019 - 2024. All rights reserved.