按下后目的地已更改,但以前的片段仍保留在UI上

时间:2019-04-20 14:45:49

标签: android navigation android-jetpack android-architecture-navigation android-jetpack-navigation

我的应用程序是使用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);
    }
}

0 个答案:

没有答案