我在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 回答
NOTE: 不推荐使用清除任务,官方说明是
Old Answer
如果您不想在代码中查看所有模糊内容,只需在
Launch Options
中查看操作属性中的Clear Task
即可 .Edit: 从Android Studio 3.2 Beta 5开始,“清除任务”在“启动选项”窗口中不再可见,但您仍可以在导航的XML代码中使用它,在 action 标记中添加
首先,将属性
app:popUpTo='your_nav_graph_id'
和app:popUpToInclusive="true"
添加到操作标记 .其次,使用上面的操作作为参数导航到目的地 .
NOTE :如果使用方法
navigate(@IdRes int resId)
导航,则无法获得所需的结果 . 因此,我使用方法navigate(@NonNull NavDirections directions)
.我终于想通了How to disable UP in Navigation for some fragment with the new Navigation Architecture Component?
我必须将.setClearTask(true)指定为NavOption .