This my Activity
package com.example.calender
import android.annotation.SuppressLint
import java.util.*
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Parcel
import android.os.Parcelable
import android.widget.Button
import androidx.core.util.Pair
import com.google.android.material.datepicker.CalendarConstraints
import com.google.android.material.datepicker.DateValidatorPointBackward
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.datepicker.RangeDateSelector
@SuppressLint("RestrictedApi")
class MainActivity() : AppCompatActivity() {
private lateinit var datePicker: MaterialDatePicker<Pair<Long, Long>>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val dateRangeButton = findViewById<Button>(R.id.dateRangeButton)
dateRangeButton.setOnClickListener {
showCustomDatePicker()
}
}
@SuppressLint("RestrictedApi")
private fun showCustomDatePicker() {
val today = MaterialDatePicker.todayInUtcMilliseconds()
val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
calendar.timeInMillis = today
// Set the start date as January 1st of the current year
calendar.set(Calendar.MONTH, Calendar.JANUARY)
calendar.set(Calendar.DAY_OF_MONTH, 1)
val startOfYear = calendar.timeInMillis
// Set the end date as the last day of the current month
calendar.timeInMillis = today
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH))
val endOfMonth = calendar.timeInMillis
val constraintsBuilder = CalendarConstraints.Builder()
.setStart(startOfYear)
.setEnd(endOfMonth)
.setOpenAt(endOfMonth)
.setValidator(DateValidatorPointBackward.now())
datePicker = MaterialDatePicker()
val selector = CustomOnSelectionChangedListener(supportFragmentManager, datePicker)
datePicker = MaterialDatePicker.Builder.customDatePicker(selector)
.setCalendarConstraints(constraintsBuilder.build())
.build()
datePicker.show(supportFragmentManager, "DATE_RANGE_PICKER")
// datePicker.dismiss()
}
}
This my CustomActionListnerClass
package com.example.calender
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Parcel
import com.google.android.material.datepicker.CalendarConstraints
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.datepicker.RangeDateSelector
import java.util.*
import androidx.core.util.Pair
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import com.google.android.material.datepicker.DateValidatorPointBackward
@SuppressLint("RestrictedApi")
class CustomOnSelectionChangedListener(
private val fragmentManager: FragmentManager,
private var datePicker: MaterialDatePicker<Pair<Long, Long>>?
) : RangeDateSelector() {
private var first = true
private var firstDate: Long? = null
override fun select(selection: Long) {
if (first || selection < firstDate!!) {
super.select(selection)
super.select(selection)
firstDate = selection
onSelectionOfFirstDate(firstDate)
first = false
} else {
super.select(firstDate!!)
super.select(selection)
if (selection != firstDate) {
first = true
}
}
}
@SuppressLint("SuspiciousIndentation")
private fun onSelectionOfFirstDate(firstDate: Long?) {
val calendar1 = Calendar.getInstance()
calendar1.timeInMillis = firstDate!!
// Add six days to the first date selection
calendar1.add(Calendar.DAY_OF_MONTH, 6)
val maxDate = calendar1.timeInMillis
val today = MaterialDatePicker.todayInUtcMilliseconds()
val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
calendar.timeInMillis = today
// Set the start date as January 1st of the current year
calendar.set(Calendar.MONTH, Calendar.JANUARY)
calendar.set(Calendar.DAY_OF_MONTH, 1)
val startOfYear = calendar.timeInMillis
// Set the end date as the last day of the current month
calendar.timeInMillis = today
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH))
val endOfMonth = calendar.timeInMillis
val constraintsBuilder = CalendarConstraints.Builder()
.setStart(startOfYear)
.setEnd(endOfMonth)
.setOpenAt(endOfMonth)
.setValidator(DateValidatorPointBackward.before(maxDate))
.build()
val newDatePicker =
MaterialDatePicker.Builder.customDatePicker(this@CustomOnSelectionChangedListener)
.setCalendarConstraints(constraintsBuilder).build()
//datePicker = newDatePicker
Handler().post {
if (datePicker!!.isVisible) {
datePicker!!.dismiss()
}
datePicker = newDatePicker
}
datePicker = newDatePicker
datePicker!!.show(fragmentManager, "Select Range")
}
}
This is my XML Code:-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/dateRangeTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Selected Date Range: " />
<Button
android:id="@+id/dateRangeButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select Date Range" />
</LinearLayout>
while i am select first range date from picker the dates after the 7 days of selection get disable and and i can select range with in that seven days after the save button click the first range picker is getting open how to resolve this issue