当前位置: 首页 > 知识库问答 >
问题:

在Android中导航到另一个片段后如何清除导航堆栈

邵昆琦
2023-03-14

我正在使用android中的新导航架构组件,在移动到一个新的片段后,我被困在清除导航堆栈中。

示例:我在loginFragment中,当我导航到home片段时,我希望该片段从堆栈中清除,这样当用户按下back按钮时,他就不会返回到loginFragment。

我正在使用一个简单的navhostfragment.findnavcontroller(Fragment).navigate(r.id.homeFragment)进行导航。

当前代码:

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
                    } else {
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                    }
                }
            });

我尝试使用navigate()中的NavOptions,但back按钮仍然将我发送回loginFragment

NavOptions.Builder navBuilder = new NavOptions.Builder();
NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build();   
             NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);

共有2个答案

王季萌
2023-03-14

我认为您的问题特别涉及到如何使用Pop行为/Pop to/app:PopupTo(在xml中)

在文档中,
在导航之前弹出到给定的目标。这将从后堆栈中弹出所有不匹配的目标,直到找到此目标为止。

示例(简单的求职应用程序)
我的start_screen_nav图是这样的:

startScreenFragment (start) -> loginFragment -> EmployerMainFragment

                            -> loginFragment -> JobSeekerMainFragment

如果我想导航到EmployerMainFragment并弹出所有StartScreenFragment,那么代码将是:

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/startScreenFragment"
            app:popUpToInclusive="true" />

如果要导航到EmployerMainFragment并弹出所有不包括StartScreenFragment,则代码将为:

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/startScreenFragment"/>

如果我想导航到EmployerMainFragment并弹出LoginFragmentStartScreenFragment,则代码将为:

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/loginFragment"
            app:popUpToInclusive="true"/>

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/startScreenFragment"/>
施雅懿
2023-03-14

首先,向action标记添加属性app:popupto='your_nav_graph_id'app:popuptoInclusive=“true”

<fragment
    android:id="@+id/signInFragment"
    android:name="com.glee.incog2.android.fragment.SignInFragment"
    android:label="fragment_sign_in"
    tools:layout="@layout/fragment_sign_in" >
    <action
        android:id="@+id/action_signInFragment_to_usersFragment"
        app:destination="@id/usersFragment"
        app:launchSingleTop="true"
        app:popUpTo="@+id/main_nav_graph"
        app:popUpToInclusive="true" />
</fragment>

其次,导航到目的地,使用上述操作作为参数。

findNavController(fragment).navigate(
     SignInFragmentDirections.actionSignInFragmentToUserNameFragment())

有关更多信息,请参阅文档。

注意:如果使用navigate(@idres int resId)方法导航,则不会得到所需的结果。因此,我使用了navigate(@nonnull NavDirections directions)方法。

 类似资料:
  • 我有一个片断,它包含了ImgaeView(s)在它的XML中,我从这些图像导航到另一个片断,但问题是底页保持打开,当我导航到另一个片断时,如何使它折叠? 这是底片的图片 在这里,我导航到另一个片段,但底部页仍然显示在屏幕上 下面是片段内部的代码 所以我的问题是: 在我导航到另一个片段后,如何使它崩溃?

  • 我有一个包含FragmentStatePagerAdapter的活动在这个FragmentStatePagerAdapter中有三个片段。或者,当调用适当的getItem()时,它们会被启动。 该活动执行数据密集型任务,完成后发送广播。我已经在FragmentStatePagerAdapter中的每个片段中注册了一个广播接收器。 现在这一切都很好,除了一件事: 当我们滚动到位置2处的片段(位置1和

  • 我试着从一个片段到主要片段。编译器不喜欢我的代码,但我不确定是什么问题。转换片段的最佳实践是什么? //这是我要导航到的主片段的xml 2019-07-12 17:49:45.091 959 4-9594/com.example.cribb E/AndroidRuntime:致命异常:主进程:com.example.cribb,PID:9594 Android.content.res.resour

  • 您好,我已经使用导航组件和导航图从一个片段导航到另一个片段,我想要的是防止onBack完全按下,这样当用户单击onBack时,应用程序将退出。我正在从注册片段导航到主页片段。 这是导航图中的代码 这是我的代码,当点击注册按钮时,在注册片段中导航

  • 我已经从连接到NavController的导航抽屉中导航到了DialogFragment。但当我导航到另一个目标时,我已经将弹出窗口设置为包含对话框片段,但它并没有清除堆栈。如何清除堆栈? AM从LogoutDialog调用此方法 我只使用片段和一个活动。 这是我导航图的一部分

  • 当显示主片段时,我试图清除后堆栈中的所有片段。在导航图中,我添加了这个动作 在登录片段中。我尝试了findNavController()。导航(LoginFragmentDirections.actionLoginFragmentToHomeFragment()) 和 我从这里的文件中了解到https://developer.android.com/guide/navigation/navigat