为什么仍然在 Fragment A 中,尽管已经导航到 Fragment B 导航组件?
Why still in Fragment A although already navigate to Fragment B Navigation Component?
-
android
-
android-navigation
-
android-jetpack
-
android-architecture-navigation
-
android-jetpack-navigation
我有 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);
}
});
}
所以这按预期工作,单击 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) {
android
android-navigation
android-jetpack
android-architecture-navigation
android-jetpack-navigation
我有 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);
}
});
}
所以这按预期工作,单击 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) {