我有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方法。
是什么原因造成的?怎样解决这个问题?
Android会维护一个包含您访问过的目的地的后台堆栈。当用户打开应用程序时,您的应用程序的第一个目标位于堆栈上。对该navigate()
方法的每次调用都会在堆栈顶部放置另一个目标。向上敲击或向后敲击分别调用NavController.navigateUp()
和NavController.popBackStack()
方法,以从堆栈中移除(或弹出)顶部目标。
NavController.popBackStack()
返回一个布尔值,指示它是否成功弹出回到另一个目的地。当它返回false时,最常见的情况是手动弹出图形的起始目标位置。
当该方法返回false时,NavController.getCurrentDestination()
返回null。您负责导航到新的目的地或通过调用finish()
“活动”来处理流行音乐。
使用操作进行导航时,可以选择使用操作的popUpTo
和popUpToInclusive
参数将其他目标弹出后退栈。
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
)
...
}
那么在这种情况下我该怎么办?你能提供例子吗?
每当您需要返回时,请使用NavController.popBackStack()或NavController.navigateUp()参见此处developer.android.com/guide/navigation/…
是否有用?
它仍然无法回到上一个片段
我编辑了问题..你可以看看