首页 文章

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

提问于
浏览
7

我在android中使用了新的 Navigation Architecture Component ,在移动到新的片段之后我被困在清理导航堆栈中 .

示例:我在loginFragment中,当我导航到主片段时,我希望从堆栈中清除此片段,以便用户在按下后退按钮时不会返回到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,但后退按钮仍然将我发送回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);

3 回答

  • 5

    NOTE: 不推荐使用清除任务,官方说明是

    不推荐使用此方法 . 将setPopUpTo(int,boolean)与NavController的图形的id一起使用,并将inclusive设置为true .

    Old Answer

    如果您不想在代码中查看所有模糊内容,只需在 Launch Options 中查看操作属性中的 Clear Task 即可 .

    Launch Options

    Edit: 从Android Studio 3.2 Beta 5开始,“清除任务”在“启动选项”窗口中不再可见,但您仍可以在导航的XML代码中使用它,在 action 标记中添加

    app:clearTask="true"
    
  • 6

    首先,将属性 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())
    

    NOTE :如果使用方法 navigate(@IdRes int resId) 导航,则无法获得所需的结果 . 因此,我使用方法 navigate(@NonNull NavDirections directions) .

  • 3

    我终于想通了How to disable UP in Navigation for some fragment with the new Navigation Architecture Component?

    我必须将.setClearTask(true)指定为NavOption .

    mAuth.signInWithCredential(credential)
                .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            Log.d(TAG, "signInWithCredential:success");
    
    
                            NavOptions.Builder navBuilder = new NavOptions.Builder();
                            NavOptions navOptions = navBuilder.setClearTask(true).build();
                            NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment,null,navOptions);
                        } else {
                            Log.w(TAG, "signInWithCredential:failure", task.getException());
    
                        }
    
                    }
                });
    

相关问题