Мое приложение - это приложение с одним активным действием, использующее Android Jetpack. У меня есть следующие строки кода в onViewCreated () моего фрагмента:
requireActivity().addOnBackPressedCallback(getViewLifecycleOwner(), () ->
navController.navigateUp());
Это работает для моих фрагментов, за исключением одного случая, когда я перехожу из моего InputFragment в ReviewFragment. Я ожидаю, что InputFragment появится, когда я снова нажму из ReviewFragment, но ReviewFragment все еще отображается. Я добавил код в свой MainActivity, чтобы отобразить текущий пункт назначения в сообщении Toast, чтобы подтвердить, действительно ли пункт назначения изменился при повторном нажатии, и достаточно верно, что пункт назначения уже изменился на InputFragment, но мой пользовательский интерфейс все еще остается в 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);
}
}