Место назначения изменилось при повторном нажатии, но предыдущий фрагмент все еще остается в интерфейсе пользователя. - PullRequest
0 голосов
/ 20 апреля 2019

Мое приложение - это приложение с одним активным действием, использующее 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...