Search code examples
androidandroid-activityandroid-dialogandroid-dialogfragment

Android how to tell if the dialog is dismissed or finished


In a activity ShowInfoActivity , user brings up a dialog by clicking on a button:

mButtonInfo.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DialogFragment infoDialog = new UpdateUserInfoDialog();
        infoDialog.show(getFragmentManager(), "Update Info Dialog");
    }
});

I made this dialog in a separate file UpdateUserInfoDialog.java and it has an empty activity UpdateUserInfoActivity.java which is required to show this dialog.

I have another method that should be executed when the user has done with the dialog, either setPositiveButton or setNegativeButton. I can not reference the ShowInfoActivity in the dialog class.

Here is the code for dialog class:

public class UpdateUserInfoDialog extends DialogFragment{

    public static final String TAG = "ChangeWeightDialog";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mReg = Storage.readUserRegistration(getActivity().getApplicationContext());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container
            , Bundle savedInstanceState) {

        if(getDialog() != null) {
            getDialog().setCanceledOnTouchOutside(false);
        }

        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        final LayoutInflater inflater = getActivity().getLayoutInflater();
        final View dialogView = inflater.inflate(R.layout.dialog_update_userinfo, null);

    //Create dialog and stuff......

        builder.setPositiveButton("update", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            //Handle positive click
            }
        });

        builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //handle dnegative
                dismiss();
            }
        });


        builder.setTitle("update personal information");
        builder.setView(dialogView);
        return builder.create();
    }
}

So what I am looking for is to have kind of a listener when user clicks on button to show the activity, to tell if it has been dismissed or done:

mButtonInfo.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DialogFragment infoDialog = new UpdateUserInfoDialog();

        //SOMETHING LIKE:
        infoDialog.whenDismissed(doThisMethod());

        infoDialog.show(getFragmentManager(), "Update Info Dialog");
    }
});

I have tried this but it gives NullPointer in OnDissmiss(new ...) line:

mButtonInfo.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DialogFragment infoDialog = new UpdateUserInfoDialog();
        infoDialog.onDismiss(new DialogInterface() {
            @Override
            public void cancel() {
                showUserInformation();
            }
            @Override
            public void dismiss() {
                showUserInformation();
            }
        });
        infoDialog.show(getFragmentManager(), "Update Info Dialog");
    }
});

Solution

  • Try to override onDismiss() in your UpdateUserInfoDialog. It should broadcast a custom Intent that notifies about dialog cancellation. You may catch this Intent in the specific component that will invoke your doThisMethod().
    Also, see LocalBroadcastManager for "local" broadcasting.