我的应用程序是使用Android Jetpack的单一活动应用程序,我在片段的onViewCreated()中包含以下代码行:
requireActivity().addOnBackPressedCallback(getViewLifecycleOwner(), () ->
navController.navigateUp());
这适用于我的片段,除了从我的InputFragment过渡到ReviewFragment的一种情况。我希望当我从ReviewFragment上按回时,InputFragment会出现,但是ReviewFragment仍然显示。我在MainActivity中添加了代码,以在Toast消息中显示当前目的地,以确认是否确实在后按时更改了目的地,并且确实如此,目的地已经更改为InputFragment,但是我的UI仍然保持在ReviewFragment。我尝试将一个全局操作添加到ReviewFragment,并使用该全局操作从InputFragment导航到ReviewFragment,但它不会更改任何内容。有没有人遇到这种行为?
这是我的InputFragment的代码:
public class InputFragment extends BaseFragment {
private FragmentInputBinding binding;
private NavController navController;
private MainViewModel activityViewModel;
private InputViewModel viewModel;
public InputFragment() {
// Required empty public constructor
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initDagger();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(
inflater, R.layout.fragment_input, container, false);
viewModel = ViewModelProviders.of(this).get(InputViewModel.class);
activityViewModel = ViewModelProviders.of(requireActivity()).get(MainViewModel .class);
binding.setViewModel(viewModel);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
navController = Navigation.findNavController(view);
// go back to previous screen
requireActivity().addOnBackPressedCallback(getViewLifecycleOwner(), () ->
navController.navigateUp());
viewModel.input.observe(this, this::continueTransaction);
}
@Override
public void onResume() {
super.onResume();
// call this so that soft keyboard does not push up the continue button/bottom image
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
private void initDagger() {
AndroidSupportInjection.inject(this);
}
private void continueTransaction(Input input) {
if(!(TextUtils.isEmpty(input.geInputA())
|| TextUtils.isEmpty(input.getInputB())
|| TextUtils.isEmpty(input.getINputC())
|| TextUtils.isEmpty(input.getInputD()))) {
activityViewModel.onInput(input);
navController.navigate(R.id.action_input_dest_to_review_dest);
}
}
这是我的ReviewFragment的代码:
public class ReviewFragment extends BaseFragment {
private static final String TAG = ReviewFragment.class.getSimpleName();
private FragmentReviewBinding binding;
private NavController navController;
private MainViewModel viewModel;
public ReviewFragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initDagger();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(
inflater, R.layout.fragment_review, container, false);
viewModel = ViewModelProviders.of(getActivity()).get(MainViewModel.class);
binding.setViewModel(viewModel);
binding.btContinue.setOnClickListener(v -> onContinueButtonClicked());
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
navController = Navigation.findNavController(view);
setupReviewDetails(viewModel.txnType);
// go back to previous screen
requireActivity().addOnBackPressedCallback(getViewLifecycleOwner(), () ->{
boolean result = navController.navigateUp();
Log.d(TAG, "result: " + result);
return result;
});
}
private void setupReviewDetails(TType type) {
if(type == TYPE_A) {
binding.activationView.setVisibility(View.VISIBLE);
binding.detailsView.setVisibility(View.GONE);
binding.cbAcceptTnc.setChecked(false);
} else {
binding.cbAcceptTnc.setChecked(true);
binding.btContinue.setEnabled(true);
binding.cbAcceptTnc.setVisibility(View.INVISIBLE);
}
}
private void onContinueButtonClicked() {
navController.navigate(R.id.action_review_dest_to_process_dest);
}
private void initDagger() {
AndroidSupportInjection.inject(this);
}
}