Search code examples
android-fragmentsandroid-dialogfragmentfragmenttransactionfragment-backstack

DialogFragment not found in fragmentTransaction


I am displaying DialogFragment from a manager. DialogFragment display multiple times.

I want to know is there a way to check from transaction whether this fragment already displaying. So don't display it.

@Override
public void show(FragmentManager manager, String tag) {
    try {
        FragmentTransaction ft = manager.beginTransaction();

        Fragment prev = manager.findFragmentByTag(tag);
        if (prev == null) {
            ft.add(this, tag);
            ///ft.addToBackStack(tag);
            ft.commitAllowingStateLoss();
        }

    } catch (IllegalStateException e) {
        Log.d("ABSDIALOGFRAG", "Exception", e);
    }
}

I am calling my Fragment like

CustomerFeedbackDialog feedbackDialog = CustomerFeedbackDialog.newInstance(genaric.getData(), type);

feedbackDialog.show(getSupportFragmentManager(), "feedbackDialog");

I have call findFragmentByTag but it is always null. I don't want to show already displayed Fragment. otherwise it duplicate . Mulitple dialogFragment opens

I know I can do it using a flag in sharedprefs

EDIT Solution found

Thanks for your help. Problem solved and I posted answer below


Solution

  • I finally able to handle it by overriding show method and addToBackStack(null) and executePendingTransactions

    Firstly to put tag in findFragmentByTag addToBackStack is must otherwise tag is not added in fragmentTransaction.

        @Override
        public void show(FragmentManager manager, String tag) {
            try {
                FragmentTransaction ft = manager.beginTransaction();
    
                Fragment prev = manager.findFragmentByTag(tag);
                if (prev == null) {
                    ft.add(this, tag);
                    ft.addToBackStack(null);
                    ft.commitAllowingStateLoss();
                    manager.executePendingTransactions();
                }
    
            } catch (IllegalStateException e) {
                Log.d("ABSDIALOGFRAG", "Exception", e);
            }
        }
    

    Now if fragment is already in transaction. It will not display again..