我在 android 中使用新的 导航架构组件 ,在移动到新片段后我被困在清除导航堆栈中。
示例:我在 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);
首先,将属性app:popUpTo='your_nav_graph_id'和添加app:popUpToInclusive="true"到操作标签。
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())
有关更多信息,请参阅文档。
注意 :如果您使用 method 导航navigate(@IdRes int resId),您将无法获得所需的结果。因此,我使用了 method navigate(@NonNull NavDirections directions)。
navigate(@IdRes int resId)
navigate(@NonNull NavDirections directions)