Search code examples
androidandroid-alertdialogandroid-dialogfragmentdismiss

DialogFragment is dismissed right after show


I created a DialogFragment which should be shown after onActivityResult is called. But right after dialog.show() is called, the Dialog dismissed automatically for no reason.

I am using the BarcodeScanner lib to scan a QR-Code, in onActivityResult I just save the Data (I also tried to show the Dialog at this point, but it didn't worked.)

if ((requestCode == REQUEST_BARCODESCANNER) && (resultCode == RESULT_OK)) {
    mBarcodeScanned = true;
    mBarcodeScanResult = getBarcodeScannerResult(data.getExtras());
}

in onResume I am checking now for this variables:

if(mBarcodeScanResult == null && mBarcodeScanned){
    mBarcodeScanned = false;
    showDialog(MyDialogFragment.getInvalidQrCodeDialog(this));
} else if(mBarcodeScanResult != null && mBarcodeScanned){
    showDialog(MyDialogFragment.getSomeDialog(this, v1, v2));
}

in showDialog() I just call show:

dialog.show(getSupportFragmentManager(), MyDialogFragment.class.getSimpleName());

Now it should show the Dialog, if a QR-Code was scanned. For some reason right after dialog.show() I checked onDismiss() inside of the MyDialogFragment class, and it was called as well, but I really don't know why?

The MyDialogFragment is using the onCreateDialog methode, which creates AlertDialogs to return. The methode getSomeDialog() and getInvalidQrCodeDialog() are just instanciate the Fragment.

EDIT: the MyDialogClass

public class MyDialogFragment extends DialogFragment {

    private static final String BUNDLE_DIALOG_TYPE = "bundle_dialog_type";

    private DialogType mDialogType;

    public enum DialogType{
        QR_CODE_INVALID, SOME_DIALOG
    }

    public static Fragment getInvalidQrCodeDialog(final Context context) {
        Bundle args = new Bundle();
        args.putString(BUNDLE_DIALOG_TYPE, DialogType.QR_CODE_INVALID.name());
        return MyDialogFragment.instantiate(context, MyDialogFragment.class.getName(), args);
    }

    public static Fragment getSomeDialog(final Context context) {
        Bundle args = new Bundle();
        args.putString(BUNDLE_DIALOG_TYPE, DialogType.SOME_DIALOG.name());
        return MyDialogFragment.instantiate(context, MyDialogFragment.class.getName(), args);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handleArguments();
    }

    private void handleArguments() {
        final Bundle arguments = getArguments();
        if(arguments != null) {
            mDialogType = DialogType.valueOf(arguments.getString(BUNDLE_DIALOG_TYPE, DialogType.SOME_DIALOG.name()));
        }
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        switch(mDialogType){
            case QR_CODE_INVALID: return DialogHelper.showQRCodeInvalidDialog(getActivity());
            case SOME_DIALOG: return DialogHelper.showSomeDialog(getActivity());
            default: return null;
        }
    }
}

and the DialogHelper does something like this:

public static AlertDialog showQRCodeInvalidDialog(final Context context){
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(R.string.barcode_invalid);
    builder.setTitle(R.string.barcode_invalid_title);
    builder.setPositiveButton(android.R.string.ok,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.dismiss();
                }
            });
    return builder.create();
}

Solution

  • The problem seems to be the support-package DialogFragment. I just changed it from support to the original DialogFragment and everything worked like expected.