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

问题描述 投票:0回答:2

我有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);
            }
        });
}

因此,这项工作符合预期,单击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()功能。

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

问题:

为什么会发生这种情况?是什么原因造成的??以及如何解决这个问题?

android android-jetpack android-navigation android-architecture-navigation android-jetpack-navigation
2个回答
1
投票
requireActivity().getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) {

应该是

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

1
投票

您可以尝试用这段代码替换您的代码吗:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.