The Date Picker Range dialog is opening two time how to make open single dialog and perform necessary operation according to my code

77 Views Asked by At

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

0

There are 0 best solutions below