Created
November 24, 2022 13:48
-
-
Save SelvinPL/ed73544da79022634a38e288d7a13088 to your computer and use it in GitHub Desktop.
Parent Fragment or Activity should implement DatePicker.Callback
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public class DatePicker extends DialogFragment implements DatePickerDialog.OnDateSetListener { | |
| static final Calendar MAX_DATE_VALUE = DateTimeUtils.addYears(DateTimeUtils.today(), 2); | |
| public static DatePicker newInstance(int id, Calendar date) { | |
| return newInstance(id, date, DateTimeUtils.today(), MAX_DATE_VALUE); | |
| } | |
| public static DatePicker newInstance(int id, Calendar date, Calendar minDate, Calendar maxDate) { | |
| DatePicker frag = new DatePicker(); | |
| Bundle args = new Bundle(); | |
| args.putSerializable(DATE, date); | |
| args.putSerializable(MIN_DATE, minDate); | |
| args.putSerializable(MAX_DATE, maxDate == null ? MAX_DATE_VALUE : maxDate); | |
| args.putInt(ID, id); | |
| frag.setArguments(args); | |
| return frag; | |
| } | |
| @NonNull | |
| public Dialog onCreateDialog(Bundle savedInstanceState) { | |
| final Bundle arguments = requireArguments(); | |
| final Calendar calendar = (Calendar) arguments.getSerializable(DATE); | |
| if (calendar != null) { | |
| final DatePickerDialog dialog = new DatePickerDialog(this.requireActivity(), R.style.AppTheme_Light_Dialog, this, | |
| calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); | |
| setMaxDate(dialog, (Calendar) arguments.getSerializable(MAX_DATE)); | |
| setMinDate(dialog, (Calendar) arguments.getSerializable(MIN_DATE)); | |
| return dialog; | |
| } | |
| throw new RuntimeException("No DATE argument"); | |
| } | |
| @Override | |
| public void onDateSet(android.widget.DatePicker view, int year, int monthOfYear, int dayOfMonth) { | |
| final Bundle arguments = requireArguments(); | |
| final Calendar minDate = (Calendar) arguments.getSerializable(MIN_DATE); | |
| final Calendar maxDate = (Calendar) arguments.getSerializable(MAX_DATE); | |
| final Calendar calendar = DateTimeUtils.today(); | |
| calendar.set(Calendar.YEAR, year); | |
| calendar.set(Calendar.MONTH, monthOfYear); | |
| calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); | |
| if (minDate != null && calendar.compareTo(minDate) < 0) | |
| runCallback(arguments.getInt(ID), false, minDate); | |
| else if (maxDate != null && calendar.compareTo(maxDate) > 0) | |
| runCallback(arguments.getInt(ID), false, maxDate); | |
| else | |
| runCallback(arguments.getInt(ID), false, calendar); | |
| } | |
| private void runCallback(final int ID, boolean canceled, Calendar date) { | |
| boolean handled = false; | |
| if (getParentFragment() != null && getParentFragment() instanceof Callback) | |
| handled = ((Callback) getParentFragment()).onAction(ID, canceled, date); | |
| if (!handled && getActivity() instanceof Callback) | |
| ((Callback) getActivity()).onAction(ID, canceled, date); | |
| } | |
| public void onCancel(@NonNull DialogInterface dialog) { | |
| final Bundle arguments = requireArguments(); | |
| final Calendar calendar = (Calendar) arguments.getSerializable(DATE); | |
| runCallback(arguments.getInt(ID), true, calendar); | |
| super.onCancel(dialog); | |
| } | |
| private void setMaxDate(DatePickerDialog dialog, Calendar maxDate) { | |
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) | |
| dialog.getDatePicker().setCalendarViewShown(false); | |
| dialog.getDatePicker().setMaxDate(maxDate.getTimeInMillis()); | |
| } | |
| private void setMinDate(DatePickerDialog dialog, Calendar minDate) { | |
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) | |
| dialog.getDatePicker().setCalendarViewShown(false); | |
| dialog.getDatePicker().setMinDate(minDate.getTimeInMillis()); | |
| } | |
| public interface Callback { | |
| boolean onAction(final int ID, boolean canceled, Calendar date); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment