为什么仍然在 Fragment A 中,尽管已经导航到 Fragment B 导航组件?

Why still in Fragment A although already navigate to Fragment B Navigation Component?

我有 2 个片段,LoginFragmentSignUpFragment。在 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);
            }
        });
}

所以这按预期工作,单击 SignUpFragment.java 中的后退按钮时我可以返回 LoginFragment.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.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)引起的错误,意味着它是由SignUpFragment.java中的handleOnBackPressed()函数引起的。

但实际上我在 LoginFragment.java 中单击后退按钮。而 LoginFragment.java 中没有任何 handleOnBackPressed() 功能。

我完全不知道为什么会发生这种行为?

问题:

为什么会这样?这是什么原因造成的??以及如何解决这个问题??

你能试试用这段代码替换你的代码吗:

@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);
    });

编辑:根据接受的答案更改代码,并提供完整代码。

requireActivity().getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) {

应该是

requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) {