为什么我无法使用导航组件返回到上一个片段?
Why I cannot go back to previous fragment with Navigation Component?
在我的应用程序中,我有 3 个主屏幕 - 探索、我的群组、个人资料。在我的群组中,我有群组列表,当我点击一个群组时,我被重定向到单个 GroupFragment。那很好用。但是当我想通过手势返回时(从 phone 的右侧到中心)应用程序将进入后台并显示“桌面”。我想从组返回到 MyGroups 片段。
编辑:我可以返回到上一个片段 (MyGroups) 的唯一方法是在组片段中的某个按钮上创建 onClickListener。像那样:
backButton.setOnClickListener { findNavController().popBackStack() }
为什么我的下面的代码无法正常工作,因为它应该使用手势向后滑动?
nav_dashboard_menu:
<?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_dashboard_menu"
app:startDestination="@id/nav_explore">
<include app:graph="@navigation/nav_explore" />
<include app:graph="@navigation/nav_my_groups" />
<include app:graph="@navigation/nav_profile" />
</navigation>
nav_my_groups:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_my_groups"
app:startDestination="@id/myGroupsFragment">
<include app:graph="@navigation/nav_group" />
<fragment
android:id="@+id/myGroupsFragment"
android:name="com.wojciechkula.locals.presentation.mygroups.MyGroupsFragment"
android:label="My groups"
tools:layout="@layout/fragment_my_groups">
<action
android:id="@+id/openGroup"
app:destination="@id/nav_group">
<argument
android:name="groupId"
app:argType="string" />
<argument
android:name="groupName"
app:argType="string" />
</action>
</fragment>
</navigation>
nav_group:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_group"
app:startDestination="@id/groupFragment">
<fragment
android:id="@+id/groupFragment"
android:name="com.wojciechkula.locals.presentation.group.GroupFragment"
android:label="Group"
tools:layout="@layout/fragment_group">
<argument
android:name="groupId"
app:argType="string" />
<argument
android:name="groupName"
app:argType="string" />
</fragment>
</navigation>
我将从 MyGroups 转到带有 navController 和 Destination 的组。
我的群组导航器:
internal class MyGroupsNavigator @Inject constructor() {
fun openGroup(navController: NavController, id: String, name: String) {
val destination = MyGroupsFragmentDirections.openGroup(id, name)
navController.navigate(destination)
}
}
您也可以使用 OnBackPressDispatcher。但是不要忘记删除 handleOnBackPress 方法中的回调。
here
在 OnViewCreated 中:
requireActivity().onBackPressedDispatcher
.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
findNavController().popBackStack()
}
})
在我的应用程序中,我有 3 个主屏幕 - 探索、我的群组、个人资料。在我的群组中,我有群组列表,当我点击一个群组时,我被重定向到单个 GroupFragment。那很好用。但是当我想通过手势返回时(从 phone 的右侧到中心)应用程序将进入后台并显示“桌面”。我想从组返回到 MyGroups 片段。
编辑:我可以返回到上一个片段 (MyGroups) 的唯一方法是在组片段中的某个按钮上创建 onClickListener。像那样:
backButton.setOnClickListener { findNavController().popBackStack() }
为什么我的下面的代码无法正常工作,因为它应该使用手势向后滑动?
nav_dashboard_menu:
<?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_dashboard_menu"
app:startDestination="@id/nav_explore">
<include app:graph="@navigation/nav_explore" />
<include app:graph="@navigation/nav_my_groups" />
<include app:graph="@navigation/nav_profile" />
</navigation>
nav_my_groups:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_my_groups"
app:startDestination="@id/myGroupsFragment">
<include app:graph="@navigation/nav_group" />
<fragment
android:id="@+id/myGroupsFragment"
android:name="com.wojciechkula.locals.presentation.mygroups.MyGroupsFragment"
android:label="My groups"
tools:layout="@layout/fragment_my_groups">
<action
android:id="@+id/openGroup"
app:destination="@id/nav_group">
<argument
android:name="groupId"
app:argType="string" />
<argument
android:name="groupName"
app:argType="string" />
</action>
</fragment>
</navigation>
nav_group:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_group"
app:startDestination="@id/groupFragment">
<fragment
android:id="@+id/groupFragment"
android:name="com.wojciechkula.locals.presentation.group.GroupFragment"
android:label="Group"
tools:layout="@layout/fragment_group">
<argument
android:name="groupId"
app:argType="string" />
<argument
android:name="groupName"
app:argType="string" />
</fragment>
</navigation>
我将从 MyGroups 转到带有 navController 和 Destination 的组。 我的群组导航器:
internal class MyGroupsNavigator @Inject constructor() {
fun openGroup(navController: NavController, id: String, name: String) {
val destination = MyGroupsFragmentDirections.openGroup(id, name)
navController.navigate(destination)
}
}
您也可以使用 OnBackPressDispatcher。但是不要忘记删除 handleOnBackPress 方法中的回调。 here
在 OnViewCreated 中:
requireActivity().onBackPressedDispatcher
.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
findNavController().popBackStack()
}
})