温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Why Android Navigation Component screen not go back to previous Fragment,but a method in onViewCreat
android android-fragments android-navigation android-architecture-navigation android-navigation-graph

其他 - 为什么Android导航组件屏幕不返回上一个Fragment,而是onViewCreat中的方法

发布于 2020-03-31 23:23:17

我有2个片段调用,CreateRoomFragment并且DisplayPhotoFragment,导航图如下所示:

<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
                    }
                });

现在的主要问题:

通过使用上面的代码,屏幕没有返回到以前的Fragment(CreateRoomFragment)。它仍然停留在其中DisplayPhotoFragment,但是与此同时,CreateRoomFragment onViewCreated正在调用一节中的API方法

是什么原因造成的?怎样解决这个问题?

查看更多

提问者
ken
被浏览
25
Sanjay Bhalani 2020-01-31 20:57

Android会维护一个包含您访问过的目的地的后台堆栈。当用户打开应用程序时,您的应用程序的第一个目标位于堆栈上。对该navigate()方法的每次调用都会在堆栈顶部放置另一个目标。向上敲击或向后敲击分别调用NavController.navigateUp()NavController.popBackStack()方法,以从堆栈中移除(或弹出)顶部目标。

NavController.popBackStack()返回一个布尔值,指示它是否成功弹出回到另一个目的地。当它返回false时,最常见的情况是手动弹出图形的起始目标位置。

当该方法返回false时,NavController.getCurrentDestination()返回null。您负责导航到新的目的地或通过调用finish()“活动”来处理流行音乐

使用操作进行导航时,可以选择使用操作的popUpTopopUpToInclusive参数将其他目标弹出后退栈

class MyFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val onBackPressedCallback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (true == conditionForCustomAction) {
                    CustomActionHere()
                } else  NavHostFragment.findNavController(this@MyFragment).navigateUp();    
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(
        this, onBackPressedCallback
    )
    ...
}