MaterialDatePicker get selected dates
Solution 1
Just use the addOnPositiveButtonClickListener
listener called when the user confirms a valid selection:
For a single date picker:
picker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Long>() {
@Override public void onPositiveButtonClick(Long selection) {
// Do something...
//Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
//calendar.setTimeInMillis(selection);
}
});
For a range date picker:
MaterialDatePicker<Pair<Long, Long>> pickerRange = builderRange.build();
pickerRange.show(....);
pickerRange.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Pair<Long, Long>>() {
@Override public void onPositiveButtonClick(Pair<Long,Long> selection) {
Long startDate = selection.first;
Long endDate = selection.second;
//Do something...
}
});
Solution 2
For those that struggle with this and the fact that their timestamp is off a day, here is my working solution. I have a requirement of API 23 so I could not use any of the nice Epoch functions in java.time.*. The key for me was realizing I need to do the timezone offset math.
picker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Long>() {
@Override
public void onPositiveButtonClick(Long selectedDate) {
// user has selected a date
// format the date and set the text of the input box to be the selected date
// right now this format is hard-coded, this will change
;
// Get the offset from our timezone and UTC.
TimeZone timeZoneUTC = TimeZone.getDefault();
// It will be negative, so that's the -1
int offsetFromUTC = timeZoneUTC.getOffset(new Date().getTime()) * -1;
// Create a date format, then a date object with our offset
SimpleDateFormat simpleFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
Date date = new Date(selectedDate + offsetFromUTC);
dataEntry.setText(simpleFormat.format(lDate));
}
});
picker.show(myActivity.getSupportFragmentManager(), picker.toString());
Solution 3
The answer of GR Envoy is good, but I want to change a bit. It would be better to set time zone to UTC.
private val outputDateFormat = SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()).apply {
timeZone = TimeZone.getTimeZone("UTC")
}
...
picker.addOnPositiveButtonClickListener {
val text = outputDateFormat.format(it)
}
Solution 4
I searched around and found out many Material DatePicker Range get selected dates solutions were deprecated.
I am using dateRangePicker
in my project, so below codes are solely for dateRangePicker()
because I need to obtain both start date and end date.
In my Java activity code:
materialDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener() {
@Override
public void onPositiveButtonClick(Object selection) {
// Get the selected DATE RANGE
Pair selectedDates = (Pair) materialDatePicker.getSelection();
// then obtain the startDate & endDate from the range
final Pair<Date, Date> rangeDate = new Pair<>(new Date((Long) selectedDates.first), new Date((Long) selectedDates.second));
// assigned variables
Date startDate = rangeDate.first;
Date endDate = rangeDate.second;
// Format the dates in ur desired display mode
SimpleDateFormat simpleFormat = new SimpleDateFormat("dd MMM yyyy");
// Display it by setText
datedisplay.setText("SELECTED DATE : " + simpleFormat.format(startDate) + " Second : " + simpleFormat.format(endDate));
}
});
Sample output :
Solution 5
Code for Date Picker: (Here I have open date picker on click event of Button)
datePicker.setOnClickListener(v -> {
MaterialDatePicker datePicker =
MaterialDatePicker.Builder.datePicker()
.setTitleText("Select date")
.build();
datePicker.show(getSupportFragmentManager(), "date");
datePicker.addOnPositiveButtonClickListener((MaterialPickerOnPositiveButtonClickListener<Long>) selection -> {
String dateString = DateFormat.format("dd/MM/yyyy", new Date(selection)).toString();
Toast.makeText(this, dateString, Toast.LENGTH_SHORT).show();
});
});
Code for Date Range Picker: (Here I have open date range picker on click event of Button)
dateRangePicker.setOnClickListener(v -> {
MaterialDatePicker datePicker =
MaterialDatePicker.Builder.dateRangePicker()
.setSelection(new Pair(MaterialDatePicker.thisMonthInUtcMilliseconds(),
MaterialDatePicker.todayInUtcMilliseconds()))
.setTitleText("Select dates")
.build();
datePicker.show(getSupportFragmentManager(), "date");
datePicker.addOnPositiveButtonClickListener((MaterialPickerOnPositiveButtonClickListener<Pair<Long, Long>>) selection -> {
Long startDate = selection.first;
Long endDate = selection.second;
String startDateString = DateFormat.format("dd/MM/yyyy", new Date(startDate)).toString();
String endDateString = DateFormat.format("dd/MM/yyyy", new Date(endDate)).toString();
String date = "Start: " + startDateString + " End: " + endDateString;
Toast.makeText(TextViewActivity.this, date, Toast.LENGTH_SHORT).show();
});
});
Code for Time Picker: (Here I have open time picker on click event of Button)
timePicker.setOnClickListener(v -> {
MaterialTimePicker timePicker = new MaterialTimePicker.Builder()
.setTimeFormat(TimeFormat.CLOCK_12H)
.setHour(12)
.setTitleText("Select Appointment time")
.setMinute(10)
.build();
timePicker.show(getSupportFragmentManager(), "time");
timePicker.addOnPositiveButtonClickListener(v12 -> {
int hour = timePicker.getHour();
int min = timePicker.getMinute();
Toast.makeText(TextViewActivity.this, "Time is: " + hour + ":" + min, Toast.LENGTH_SHORT).show();
});
timePicker.addOnNegativeButtonClickListener(v13 -> Toast.makeText(TextViewActivity.this, "Cancel", Toast.LENGTH_SHORT).show());
});
Erjon
My name is Erjon Kelleci, and I work as a Sales Manager in a company in my country. I love software development, I started with excel and then with its programming environment. Now I'm into the .net world, java, python and all scripting languages. I'm a self-learned and I'm eager to know more about technology.
Updated on June 08, 2022Comments
-
Erjon almost 2 years
I'm calling a MaterialDatePicker like this in Android:
MaterialDatePicker.Builder<Pair<Long, Long>> builder = MaterialDatePicker.Builder.dateRangePicker(); CalendarConstraints.Builder constraintsBuilder = new CalendarConstraints.Builder(); builder.setCalendarConstraints(constraintsBuilder.build()); int dialogTheme = resolveOrThrow(getContext(), R.attr.materialCalendarTheme); builder.setTheme(dialogTheme); MaterialDatePicker<?> picker = builder.build(); picker.show(getFragmentManager(), picker.toString());
the library is:
dependencies { implementation 'com.google.android.material:material:1.2.0-alpha01' }
How can I get the selected date of this calendar? I can't find any listener like
onDateSet
orOnDateSetListener
-
Lorenzo Petroli over 4 yearsWould you please enhance your answer with how to convert from Long to Calendar or LocalDate? I've tried LocalDate.ofEpochDay and LocalDateTime.ofEpochSecond but it doesn't work.Thanks
-
Gabriele Mariotti over 4 years@LorenzoPetroli The picker interprets all long values as milliseconds from the UTC Epoch. You can use
Instant.ofEpochMilli(dateSelected)
andLocalDateTime.ofInstant(...)
otherwiseCalendar.setTimeInMillis(dateSelected)
. Attention toLocalDateTime.ofEpochSecond
; it works with seconds and not milliseconds. -
CoolMind almost 4 yearsFirst time it worked, but then
offsetFromUTC
was 0. So, I setsimpleFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
. Will test farther. -
Gabriele Mariotti over 3 yearsWhat solutions were deprecated?