我有2个片段,LoginFragment
和SignUpFragment
。在SignUpFragment
中时,单击底部的Android后退按钮,它导航到LoginFragment
。
这是这样做的代码:
SignUpFragment.java
@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
requireActivity().getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
NavController navController = Navigation.findNavController(view);
navController.popBackStack(R.id.signUpFragment,true);
navController.navigate(R.id.loginFragment);
}
});
}
因此,这项工作符合预期,单击LoginFragment.java
中的后退按钮,我可以返回到SignUpFragment.java
。
问题:
现在的问题是,当我在LoginFragment
中时,我再次单击底部的Android后退按钮,出现此错误:
java.lang.IllegalStateException: View android.widget.RelativeLayout{3be3bdc V.E...... ......ID 0,0-1080,1962 #7f0a017d app:id/root_layout} does not have a NavController set
at androidx.navigation.Navigation.findNavController(Navigation.java:84)
at com.company.ui.user.SignUpFragment$3.handleOnBackPressed(SignUpFragment.java:128) //WHY THIS LINE??
at androidx.activity.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.java:189)
at androidx.activity.ComponentActivity.onBackPressed(ComponentActivity.java:286)
如您所见,显示的错误是指由handleOnBackPressed(SignUpFragment.java:128)
引起的错误,表示它是由handleOnBackPressed()
中的SignUpFragment.java
功能引起的。
但是实际上我在LoginFragment.java
中时单击了后退按钮。并且LoginFragment.java
内部没有任何handleOnBackPressed()
功能。
我完全不知道为什么会发生这种行为?。
问题:
为什么会发生这种情况?是什么原因造成的??以及如何解决这个问题?
requireActivity().getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) {
应该是
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) {
您可以尝试用这段代码替换您的代码吗:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
navController = Navigation.findNavController(view);
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), () -> {
navController.popBackStack(R.id.signUpFragment,true);
navController.navigate(R.id.loginFragment);
});
编辑:根据接受的答案更改代码,并提供完整的代码。