UMAR-MOBITSOLUTIONS
UMAR-MOBITSOLUTIONS

Reputation: 78004

How do I detect a cancel click of the datepicker dialog?

i am using following example of date picker

http://developer.android.com/guide/tutorials/views/hello-datepicker.html

now i want to perform some functionality on clicking date picker cancel button but dont see cancel event inside datepickerdialog

can any one guide me how to achieve this.

any help would be appreciated.

Upvotes: 27

Views: 41353

Answers (13)

Kunal Kalwar
Kunal Kalwar

Reputation: 965

For kotlin, on dismiss and on cancel click listener ->

    datePickerDialog.setOnDismissListener {
        //on dismiss
    }

    datePickerDialog.setButton(
        DialogInterface.BUTTON_NEGATIVE, "Cancel"
    ) { _, which ->
        if (which == DialogInterface.BUTTON_NEGATIVE) {
            //on cancel click
        }
    }

Upvotes: 2

Mina Samir
Mina Samir

Reputation: 1609

Simply, if you are using or extending AppCompatDialogFragment() just override the

override fun onCancel(dialog: DialogInterface) {
    super.onCancel(dialog)
    // write your own code 
}

That is it :)

Upvotes: 0

seekingStillness
seekingStillness

Reputation: 5113

I added some additional code to @PeteH great answer (which provides for reacting to user pressing date or cancelling).

private void showDatePickerDialog() {
    final int[] year = new int[1];
    final int[] month = new int[1];
    final int[] day = new int[1];
    isDataSet = false;  // this is used by the onDismiss handler

    // Set initial time period in DatePicker to current month
    Calendar calendarCurrent = Calendar.getInstance();
    month[0] = calendarCurrent.get(Calendar.MONTH);
    day[0] =   calendarCurrent.get(Calendar.DAY_OF_MONTH);
    year[0] =  calendarCurrent.get(Calendar.YEAR);

    DatePickerDialog datePickerDialog = new DatePickerDialog(
            MyActivity,
            new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker datePicker, int y, int m, int d) {
            isDataSet =true;
            //user confirms date
            year[0] =y;
            month[0] = m;
            day[0] =d;

            //do something with date selected

        }
    },
            year[0],
            month[0],
            day[0]
    );
    datePickerDialog.setOnDismissListener(mOnDismissListener);
    datePickerDialog.show();
}
private DialogInterface.OnDismissListener mOnDismissListener =new DialogInterface.OnDismissListener() {
    public void onDismiss(DialogInterface dialog) {
        if (!isDataSet){

            //do something if user cancels

    }
};

Upvotes: 1

aanshu
aanshu

Reputation: 1602

public void showDatePicker() {

        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog datePicker = new DatePickerDialog(getActivity(), (view, year1, month1, day1) -> {
            Calendar c1 = Calendar.getInstance();
            c1.set(year1, month1, day1);
            Date date = c1.getTime();
            SimpleDateFormat formatter = new SimpleDateFormat("dd MMMM yyyy");
            String d = formatter.format(date);
//            btnDatePicker.setText(d);
//            selectedDate = d;
        }, year, month, day) {
            @Override
            public void onClick(@NonNull DialogInterface dialog, int which) {
                super.onClick(dialog, which);
                if (which == DialogInterface.BUTTON_POSITIVE) {
                } else if (which == DialogInterface.BUTTON_POSITIVE) {

                }
            }
        };

        datePicker.getDatePicker().setMinDate(System.currentTimeMillis());
        datePicker.show();
    }

Upvotes: 0

Harsh
Harsh

Reputation: 480

DatePickerDialog now exposes a onCancel listener.

DatePickerDialog datePickerDialog = DatePickerDialog.newInstance(new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePickerDialog datePickerDialog, int year, int month, int day) {
            // Do whatever you want when the date is selected.
            editText.setText(String.format("%04d-%02d-%02d", year, month+1, day));
        }
    }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));

    datePickerDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {

        }
    });

Upvotes: 1

Karan Datwani
Karan Datwani

Reputation: 795

DatePickerDialog dialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {


            }
        }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));

        dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialogInterface) {

            }
        });
        dialog.show();

Upvotes: 7

Eran Boudjnah
Eran Boudjnah

Reputation: 1278

Since DatePickerDialog is a Dialog, it supports the following:

setOnCancelListener(OnCancelListener listener)
setOnDismissListener(OnDismissListener listener)

Using both listeners, you can identify all dismissals of the date picker dialog. The first would answer the question, the latter is for completion.

Upvotes: 6

Srikanth Naidu
Srikanth Naidu

Reputation: 787

Try this:

if (resultCode == RESULT_CANCELED) {
    Toast toast = Toast.makeText(this,"Datepicker Canceled", 10000);
    toast.show();
    return;
}

Upvotes: -3

Denys Avilov
Denys Avilov

Reputation: 444

Sorry for popping up ancient question, but I faced similar problem and wrote simple successor of standard DatePickerDialog with proper behavior. See it in this topic. I hope this helps.

Upvotes: 0

PeteH
PeteH

Reputation: 1930

If you want to perform a different action depending on whether the user selected a date or not you can use an onDismiss handler. Be sure to set a Boolean (e.g., "isDataSet") to indicate whether the user selected a date or not. Here's an example:

// Date Picker Dialog
   public void showDatePickerDialog(View view) {
   int year, month, day;
   isDataSet = false;  // this is used by the onDismiss handler

// Set initial time period in DatePicker to current month
   calendarCurrent = Calendar.getInstance(); 
   month = calendarCurrent.get(Calendar.MONTH);
   day =   calendarCurrent.get(Calendar.DAY_OF_MONTH);
   year =  calendarCurrent.get(Calendar.YEAR);

   DatePickerDialog datePickerDialog = new DatePickerDialog(YourActivity.this, dateSetListener, year, month, day );
   datePickerDialog.setOnDismissListener(mOnDismissListener);
   datePickerDialog.show();
   datePickerDialog_visible=true;  //indicate dialog is up
 } // [END showDatePickerDialog] 

//onDismiss handler
private DialogInterface.OnDismissListener mOnDismissListener =
        new DialogInterface.OnDismissListener() {
            public void onDismiss(DialogInterface dialog) {
                datePickerDialog_visible=false;  //indicate dialog is cancelled/gone
                if (isDataSet) {  // [IF date was picked
                    //do something, date now selected
                } else {
                    //do someething else, dialog cancelled or exited
                }   
            }
        };

Upvotes: 9

Vijay
Vijay

Reputation: 1

The following code helped me solve an issue with the Cancel button not closing out the Date picker window. Thanks to eSilver for the solution.

dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() 
{
    public void onClick(DialogInterface dialog, int which) {
        if (which == DialogInterface.BUTTON_NEGATIVE) {
            datePickerPlugin.success(new PluginResult(PluginResult.Status.OK, ""), callBackId);
            dateDialog.hide();
        }
    }
});

Upvotes: 0

esilver
esilver

Reputation: 28483

Here's how I did it:

  DatePickerDialog dialog = new DatePickerDialog(this,
              mDateSetListener,
              year, month, day);

  dialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.cancel), new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
       if (which == DialogInterface.BUTTON_NEGATIVE) {
          // Do Stuff
       }
    }
  });

Upvotes: 82

anon
anon

Reputation:

In this part of the code:

 private DatePickerDialog.OnDateSetListener mDateSetListener =
            new DatePickerDialog.OnDateSetListener() {

                public void onDateSet(DatePicker view, int year, 
                                      int monthOfYear, int dayOfMonth) {
                    mYear = year;
                    mMonth = monthOfYear;
                    mDay = dayOfMonth;
                    updateDisplay();
                }
            };

you have to implement also onClick():

public void  onClick  (DialogInterface  dialog, int which) {
   if (which == Button.NEGATIVE) {
      //Cancel
   }
}

API for Button.NEGATIVE

Upvotes: 0

Related Questions