Tuesday, 25 May 2021

Show DialogFragment in navBackStackEntry observer result of another DialogFragment using NavigationComponent

This is onViewCreated of My Fragment:

@Override
public void onViewCreated(@NonNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    NavHostFragment navHostFragment = (NavHostFragment) requireActivity().getSupportFragmentManager().findFragmentById(R.id.container);

    binding.button.setOnClickListener(v -> {
        if (navHostFragment != null) {
            NavController navController0 = navHostFragment.getNavController();

            navController0.navigate(MyFragmentDirections.actionMyFragmentToMessageDialog(
                    false,
                    R.drawable.ic_success,
                    "My Message 1",
                    R.string.yes,
                    R.string.no,
                    R.drawable.circle_yellow
            ));
        }
    });

    if (navHostFragment != null) {
        NavController navController1 = navHostFragment.getNavController();
        NavBackStackEntry navBackStackEntry = navController1.getCurrentBackStackEntry();
        if (navBackStackEntry != null) {
            SavedStateHandle savedStateHandle = navBackStackEntry.getSavedStateHandle();
            MutableLiveData<String> liveData = savedStateHandle.getLiveData(Const.DIALOG_BTN_DATA);
            liveData.observe(getViewLifecycleOwner(), btnData -> {
                //            savedStateHandle.remove(Const.DIALOG_BTN_DATA);

                if (btnData.equals("btn_right")) {
                    Log.i(TAG, "Dialog Btn Clicked -----> btn_right");
                    NavController navController2 = navHostFragment.getNavController();
                    navController2.navigate(MyFragmentDirections.actionMyFragmentToMessageDialog(
                            false,
                            R.drawable.ic_success,
                            "My Message 2",
                            R.string.yes,
                            R.string.no,
                            R.drawable.circle_red
                    ));

                } else {
                    // Do Some Stuff
                }
            });
        }
    }
}

And this is the button onClickListener of Dialog:

binding.btnRight.setOnClickListener(v -> {
    NavHostFragment navHostFragment = (NavHostFragment) requireActivity().getSupportFragmentManager().findFragmentById(R.id.container);
    if (navHostFragment != null) {
        NavController navController = navHostFragment.getNavController();
        NavBackStackEntry navBackStackEntry = navController.getPreviousBackStackEntry();
        if (navBackStackEntry != null) {
            SavedStateHandle savedStateHandle = navBackStackEntry.getSavedStateHandle();
            savedStateHandle.set(Const.DIALOG_BTN_DATA, "btn_right");
        }
        navController.navigateUp();
    }
});

I need to show DialogFragment when another DialogFragment result received, but app crashes in statement navController2.navigate(MyFragmentDirections.actionMyFragmentToMessageDialog... and I get the below error:

java.lang.IllegalArgumentException: Navigation action/destination com.example.app:id/action_myFragment_to_messageDialog cannot be found from the current destination

I don't know what NavController to use.



from Show DialogFragment in navBackStackEntry observer result of another DialogFragment using NavigationComponent

No comments:

Post a Comment