Android开始结束时间选择器

基于PickerView改造的开始结束时间选择器,PickerView是一款很好用的选择器控件,它的时间选择器TimePickerView和条件选择器OptionsPickerView我至今都还在用,可惜已经不维护了!首先我们要引入它:

implementation 'com.contrarywind:Android-PickerView:4.1.9'
  • 需求:尽管TimePickerView很好用,但也许你会遇到用户要求一次把开始时间和结束时间都同时选择的情况,而不是点击一个地方让用户选择开始时间,再点击一个地方让用户选择结束时间!于是不得不改造一个弹框出来,同时选择开始和结束时间,大概如下所示!


    image.png

1.重写三个文件

文件一TimePickerBuilder2

import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.annotation.ColorInt
import com.bigkoo.pickerview.configure.PickerOptions
import com.bigkoo.pickerview.listener.CustomListener
import com.bigkoo.pickerview.listener.OnTimeSelectChangeListener
import com.contrarywind.view.WheelView.DividerType
import java.util.*

class TimePickerBuilder2(context: Context?, private val listener: (dateStart:Date, dateEnd:Date)->Unit) {
    private val mPickerOptions: PickerOptions = PickerOptions(PickerOptions.TYPE_PICKER_TIME)

    //Option
    fun setGravity(gravity: Int): TimePickerBuilder2 {
        mPickerOptions.textGravity = gravity
        return this
    }

    fun addOnCancelClickListener(cancelListener: View.OnClickListener?): TimePickerBuilder2 {
        mPickerOptions.cancelListener = cancelListener
        return this
    }

    fun setType(type: BooleanArray?): TimePickerBuilder2 {
        mPickerOptions.type = type
        return this
    }

    fun setSubmitText(textContentConfirm: String?): TimePickerBuilder2 {
        mPickerOptions.textContentConfirm = textContentConfirm
        return this
    }

    fun isDialog(isDialog: Boolean): TimePickerBuilder2 {
        mPickerOptions.isDialog = isDialog
        return this
    }

    fun setCancelText(textContentCancel: String?): TimePickerBuilder2 {
        mPickerOptions.textContentCancel = textContentCancel
        return this
    }

    fun setTitleText(textContentTitle: String?): TimePickerBuilder2 {
        mPickerOptions.textContentTitle = textContentTitle
        return this
    }

    fun setSubmitColor(textColorConfirm: Int): TimePickerBuilder2 {
        mPickerOptions.textColorConfirm = textColorConfirm
        return this
    }

    fun setCancelColor(textColorCancel: Int): TimePickerBuilder2 {
        mPickerOptions.textColorCancel = textColorCancel
        return this
    }

    /**
     * ViewGroup 类型的容器
     *
     * @param decorView 选择器会被添加到此容器中
     * @return TimePickerBuilder
     */
    fun setDecorView(decorView: ViewGroup?): TimePickerBuilder2 {
        mPickerOptions.decorView = decorView
        return this
    }

    fun setBgColor(bgColorWheel: Int): TimePickerBuilder2 {
        mPickerOptions.bgColorWheel = bgColorWheel
        return this
    }

    fun setTitleBgColor(bgColorTitle: Int): TimePickerBuilder2 {
        mPickerOptions.bgColorTitle = bgColorTitle
        return this
    }

    fun setTitleColor(textColorTitle: Int): TimePickerBuilder2 {
        mPickerOptions.textColorTitle = textColorTitle
        return this
    }

    fun setSubCalSize(textSizeSubmitCancel: Int): TimePickerBuilder2 {
        mPickerOptions.textSizeSubmitCancel = textSizeSubmitCancel
        return this
    }

    fun setTitleSize(textSizeTitle: Int): TimePickerBuilder2 {
        mPickerOptions.textSizeTitle = textSizeTitle
        return this
    }

    fun setContentTextSize(textSizeContent: Int): TimePickerBuilder2 {
        mPickerOptions.textSizeContent = textSizeContent
        return this
    }

    /**
     * 设置最大可见数目
     *
     * @param count suggest value: 3, 5, 7, 9
     */
    fun setItemVisibleCount(count: Int): TimePickerBuilder2 {
        mPickerOptions.itemsVisibleCount = count
        return this
    }

    /**
     * 透明度是否渐变
     *
     * @param isAlphaGradient true of false
     */
    fun isAlphaGradient(isAlphaGradient: Boolean): TimePickerBuilder2 {
        mPickerOptions.isAlphaGradient = isAlphaGradient
        return this
    }

    /**
     * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
     *
     * @param date
     * @return TimePickerBuilder
     */
    fun setDate(date: Calendar?): TimePickerBuilder2 {
        mPickerOptions.date = date
        return this
    }

    fun setLayoutRes(res: Int, customListener: CustomListener?): TimePickerBuilder2 {
        mPickerOptions.layoutRes = res
        mPickerOptions.customListener = customListener
        return this
    }

    /**
     * 设置起始时间
     * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
     */
    fun setRangDate(startDate: Calendar?, endDate: Calendar?): TimePickerBuilder2 {
        mPickerOptions.startDate = startDate
        mPickerOptions.endDate = endDate
        return this
    }

    /**
     * 设置间距倍数,但是只能在1.0-4.0f之间
     *
     * @param lineSpacingMultiplier
     */
    fun setLineSpacingMultiplier(lineSpacingMultiplier: Float): TimePickerBuilder2 {
        mPickerOptions.lineSpacingMultiplier = lineSpacingMultiplier
        return this
    }

    /**
     * 设置分割线的颜色
     *
     * @param dividerColor
     */
    fun setDividerColor(@ColorInt dividerColor: Int): TimePickerBuilder2 {
        mPickerOptions.dividerColor = dividerColor
        return this
    }

    /**
     * 设置分割线的类型
     *
     * @param dividerType
     */
    fun setDividerType(dividerType: DividerType?): TimePickerBuilder2 {
        mPickerOptions.dividerType = dividerType
        return this
    }

    /**
     * [.setOutSideColor] instead.
     *
     * @param backgroundId color resId.
     */
    @Deprecated("")
    fun setBackgroundId(backgroundId: Int): TimePickerBuilder2 {
        mPickerOptions.outSideColor = backgroundId
        return this
    }

    /**
     * 显示时的外部背景色颜色,默认是灰色
     *
     * @param outSideColor
     */
    fun setOutSideColor(@ColorInt outSideColor: Int): TimePickerBuilder2 {
        mPickerOptions.outSideColor = outSideColor
        return this
    }

    /**
     * 设置分割线之间的文字的颜色
     *
     * @param textColorCenter
     */
    fun setTextColorCenter(@ColorInt textColorCenter: Int): TimePickerBuilder2 {
        mPickerOptions.textColorCenter = textColorCenter
        return this
    }

    /**
     * 设置分割线以外文字的颜色
     *
     * @param textColorOut
     */
    fun setTextColorOut(@ColorInt textColorOut: Int): TimePickerBuilder2 {
        mPickerOptions.textColorOut = textColorOut
        return this
    }

    fun isCyclic(cyclic: Boolean): TimePickerBuilder2 {
        mPickerOptions.cyclic = cyclic
        return this
    }

    fun setOutSideCancelable(cancelable: Boolean): TimePickerBuilder2 {
        mPickerOptions.cancelable = cancelable
        return this
    }

    fun setLabel(
        label_year: String?,
        label_month: String?,
        label_day: String?
    ): TimePickerBuilder2 {
        mPickerOptions.label_year = label_year
        mPickerOptions.label_month = label_month
        mPickerOptions.label_day = label_day
        return this
    }

    /**
     * 设置X轴倾斜角度[ -90 , 90°]
     *
     * @param x_offset_year    年
     * @param x_offset_month   月
     * @param x_offset_day     日
     * @return
     */
    fun setTextXOffset(
        x_offset_year: Int,
        x_offset_month: Int,
        x_offset_day: Int
    ): TimePickerBuilder2 {
        mPickerOptions.x_offset_year = x_offset_year
        mPickerOptions.x_offset_month = x_offset_month
        mPickerOptions.x_offset_day = x_offset_day
        return this
    }

    fun isCenterLabel(isCenterLabel: Boolean): TimePickerBuilder2 {
        mPickerOptions.isCenterLabel = isCenterLabel
        return this
    }


    fun setTimeSelectChangeListener(listener: OnTimeSelectChangeListener?): TimePickerBuilder2 {
        mPickerOptions.timeSelectChangeListener = listener
        return this
    }

    fun build(): TimePickerView2 {
        return TimePickerView2(mPickerOptions, listener)
    }

    init {
        mPickerOptions.context = context
    }
}

文件二TimePickerView2

import android.content.Context
import android.text.TextUtils
import android.view.LayoutInflater
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView
import com.bigkoo.pickerview.configure.PickerOptions
import com.bigkoo.pickerview.view.BasePickerView
import java.text.ParseException
import java.util.*

class TimePickerView2(pickerOptions: PickerOptions,val listener:(dateStart:Date,dateEnd:Date)->Unit) : BasePickerView(pickerOptions.context),
    View.OnClickListener {
    private var wheelTime2 //自定义控件
            : WheelTime2? = null

    private fun initView(context: Context) {
        setDialogOutSideCancelable()
        initViews()
        initAnim()
        if (mPickerOptions.customListener == null) {
            LayoutInflater.from(context).inflate(R.layout.pickerview_time2, contentContainer)

            //顶部标题
            val tvTitle = findViewById(R.id.tvTitle) as TextView
            val rvTopBar = findViewById(R.id.rv_topbar) as RelativeLayout

            //确定和取消按钮
            val btnSubmit = findViewById(R.id.btnSubmit) as Button
            val btnCancel = findViewById(R.id.btnCancel) as Button
            btnSubmit.tag = TAG_SUBMIT
            btnCancel.tag = TAG_CANCEL
            btnSubmit.setOnClickListener(this)
            btnCancel.setOnClickListener(this)

            //设置文字
            btnSubmit.text =
                if (TextUtils.isEmpty(mPickerOptions.textContentConfirm)) "确定" else mPickerOptions.textContentConfirm
            btnCancel.text =
                if (TextUtils.isEmpty(mPickerOptions.textContentCancel)) "取消" else mPickerOptions.textContentCancel
            tvTitle.text =
                if (TextUtils.isEmpty(mPickerOptions.textContentTitle)) "" else mPickerOptions.textContentTitle //默认为空

            //设置color
            btnSubmit.setTextColor(mPickerOptions.textColorConfirm)
            btnCancel.setTextColor(mPickerOptions.textColorCancel)
            tvTitle.setTextColor(mPickerOptions.textColorTitle)
            rvTopBar.setBackgroundColor(mPickerOptions.bgColorTitle)

            //设置文字大小
            btnSubmit.textSize = mPickerOptions.textSizeSubmitCancel.toFloat()
            btnCancel.textSize = mPickerOptions.textSizeSubmitCancel.toFloat()
            tvTitle.textSize = mPickerOptions.textSizeTitle.toFloat()
        } else {
            mPickerOptions.customListener.customLayout(
                LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer)
            )
        }
        // 时间转轮 自定义控件
        val timePickerView = findViewById(R.id.timepicker) as LinearLayout
        val timePickerView2 = findViewById(R.id.timepicker2) as LinearLayout
        timePickerView.setBackgroundColor(mPickerOptions.bgColorWheel)
        timePickerView2.setBackgroundColor(mPickerOptions.bgColorWheel)
        initWheelTime2(timePickerView, timePickerView2)
    }

    private fun initWheelTime2(timePickerView: LinearLayout, timePickerView2: LinearLayout) {
        wheelTime2 = WheelTime2(
            timePickerView,
            timePickerView2,
            mPickerOptions.type,
            mPickerOptions.textGravity,
            mPickerOptions.textSizeContent
        )
//        if (listener != null) {
//            wheelTime2!!.setSelectChangeCallback {
//                try {
//                    val date = WheelTime2.dateFormat.parse(wheelTime2!!.time)
//                    val date2 = WheelTime2.dateFormat.parse(wheelTime2!!.time2)
//                    listener(date,date2)
//
//                } catch (e: ParseException) {
//                    e.printStackTrace()
//                }
//            }
//        }
        if (mPickerOptions.startYear != 0 && mPickerOptions.endYear != 0 && mPickerOptions.startYear <= mPickerOptions.endYear) {
            setRange()
        }

        //若手动设置了时间范围限制
        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {
            require(mPickerOptions.startDate.timeInMillis <= mPickerOptions.endDate.timeInMillis) { "startDate can't be later than endDate" }
            setRangDate()
        } else if (mPickerOptions.startDate != null) {
            require(mPickerOptions.startDate[Calendar.YEAR] >= 1900) { "The startDate can not as early as 1900" }
            setRangDate()
        } else if (mPickerOptions.endDate != null) {
            require(mPickerOptions.endDate[Calendar.YEAR] <= 2100) { "The endDate should not be later than 2100" }
            setRangDate()
        } else { //没有设置时间范围限制,则会使用默认范围。
            setRangDate()
        }
        setTime()
        wheelTime2!!.setLabels(
            mPickerOptions.label_year,
            mPickerOptions.label_month,
            mPickerOptions.label_day
        )
        wheelTime2!!.setTextXOffset(
            mPickerOptions.x_offset_year,
            mPickerOptions.x_offset_month,
            mPickerOptions.x_offset_day
        )
        wheelTime2!!.setItemsVisible(mPickerOptions.itemsVisibleCount)
        wheelTime2!!.setAlphaGradient(mPickerOptions.isAlphaGradient)
        setOutSideCancelable(mPickerOptions.cancelable)
        wheelTime2!!.setCyclic(mPickerOptions.cyclic)
        wheelTime2!!.setDividerColor(mPickerOptions.dividerColor)
        wheelTime2!!.setDividerType(mPickerOptions.dividerType)
        wheelTime2!!.setLineSpacingMultiplier(mPickerOptions.lineSpacingMultiplier)
        wheelTime2!!.setTextColorOut(mPickerOptions.textColorOut)
        wheelTime2!!.setTextColorCenter(mPickerOptions.textColorCenter)
        wheelTime2!!.isCenterLabel(mPickerOptions.isCenterLabel)
    }

    /**
     * 设置默认时间
     */
    fun setDate(date: Calendar?) {
        mPickerOptions.date = date
        setTime()
    }

    /**
     * 设置可以选择的时间范围, 要在setTime之前调用才有效果
     */
    private fun setRange() {
        wheelTime2!!.startYear = mPickerOptions.startYear
        wheelTime2!!.endYear = mPickerOptions.endYear
    }

    /**
     * 设置可以选择的时间范围, 要在setTime之前调用才有效果
     */
    private fun setRangDate() {
        wheelTime2!!.setRangDate(mPickerOptions.startDate, mPickerOptions.endDate)
        initDefaultSelectedDate()
    }

    private fun initDefaultSelectedDate() {
        //如果手动设置了时间范围
        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {
            //若默认时间未设置,或者设置的默认时间越界了,则设置默认选中时间为开始时间。
            if (mPickerOptions.date == null || mPickerOptions.date.timeInMillis < mPickerOptions.startDate.timeInMillis || mPickerOptions.date.timeInMillis > mPickerOptions.endDate.timeInMillis) {
                mPickerOptions.date = mPickerOptions.startDate
            }
        } else if (mPickerOptions.startDate != null) {
            //没有设置默认选中时间,那就拿开始时间当默认时间
            mPickerOptions.date = mPickerOptions.startDate
        } else if (mPickerOptions.endDate != null) {
            mPickerOptions.date = mPickerOptions.endDate
        }
    }

    /**
     * 设置选中时间,默认选中当前时间
     */
    private fun setTime() {
        val year: Int
        val month: Int
        val day: Int
        var hours: Int
        var minute: Int
        var seconds: Int
        val calendar = Calendar.getInstance()
        if (mPickerOptions.date == null) {
            calendar.timeInMillis = System.currentTimeMillis()
            year = calendar[Calendar.YEAR]
            month = calendar[Calendar.MONTH]
            day = calendar[Calendar.DAY_OF_MONTH]
        } else {
            year = mPickerOptions.date[Calendar.YEAR]
            month = mPickerOptions.date[Calendar.MONTH]
            day = mPickerOptions.date[Calendar.DAY_OF_MONTH]
        }
        wheelTime2!!.setPicker(year, month, day)
    }

    override fun onClick(v: View) {
        val tag = v.tag as String
        if (tag == TAG_SUBMIT) {
            returnData()
        } else if (tag == TAG_CANCEL) {
            if (mPickerOptions.cancelListener != null) {
                mPickerOptions.cancelListener.onClick(v)
            }
        }
        dismiss()
    }

    private fun returnData() {
        if (listener != null) {
            try {
                val date = WheelTime2.dateFormat.parse(wheelTime2!!.time)
                val date2 = WheelTime2.dateFormat.parse(wheelTime2!!.time2)
                listener(date,date2)
            } catch (e: ParseException) {
                e.printStackTrace()
            }
        }
    }

    /**
     * 动态设置标题
     *
     * @param text 标题文本内容
     */
    fun setTitleText(text: String?) {
        val tvTitle = findViewById(R.id.tvTitle) as TextView
        if (tvTitle != null) {
            tvTitle.text = text
        }
    }

    override fun isDialog(): Boolean {
        return mPickerOptions.isDialog
    }

    companion object {
        private const val TAG_SUBMIT = "submit"
        private const val TAG_CANCEL = "cancel"
    }

    init {
        mPickerOptions = pickerOptions
        initView(pickerOptions.context)
    }
}

文件三WheelTime2

import android.view.View
import com.bigkoo.pickerview.adapter.NumericWheelAdapter
import com.bigkoo.pickerview.listener.ISelectTimeCallback
import com.contrarywind.view.WheelView
import com.contrarywind.view.WheelView.DividerType
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.*

class WheelTime2(
    private val view: View,
    private val view2: View,
    private val type: BooleanArray,
    private val gravity: Int,
    private val textSize: Int
) {
    private var wv_year: WheelView? = null
    private var wv_month: WheelView? = null
    private var wv_day: WheelView? = null
    private var wv_year2: WheelView? = null
    private var wv_month2: WheelView? = null
    private var wv_day2: WheelView? = null
    var startYear = DEFAULT_START_YEAR
    var endYear = DEFAULT_END_YEAR
    private var startMonth = DEFAULT_START_MONTH
    private var endMonth = DEFAULT_END_MONTH
    private var startDay = DEFAULT_START_DAY
    private var endDay = DEFAULT_END_DAY //表示31天的
    private var currentYear = 0
    private var mSelectChangeCallback: ISelectTimeCallback? = null
    fun setPicker(year: Int, month: Int, day: Int) {
        setSolar(year, month, day)
        setSolar2(year, month, day)
        setContentTextSize()
    }

    /**
     * 设置公历
     *
     * @param year
     * @param month
     * @param day
     */
    private fun setSolar(year: Int, month: Int, day: Int) {
        // 添加大小月月份并将其转换为list,方便之后的判断
        val months_big = arrayOf("1", "3", "5", "7", "8", "10", "12")
        val months_little = arrayOf("4", "6", "9", "11")
        val list_big = Arrays.asList(*months_big)
        val list_little = Arrays.asList(*months_little)
        currentYear = year
        // 年
        wv_year = view.findViewById<View>(R.id.year) as WheelView
        wv_year!!.adapter = NumericWheelAdapter(startYear, endYear) // 设置"年"的显示数据
        wv_year!!.currentItem = year - startYear // 初始化时显示的数据
        wv_year!!.setGravity(gravity)
        // 月
        wv_month = view.findViewById<View>(R.id.month) as WheelView
        if (startYear == endYear) { //开始年等于终止年
            wv_month!!.adapter = NumericWheelAdapter(startMonth, endMonth)
            wv_month!!.currentItem = month + 1 - startMonth
        } else if (year == startYear) {
            //起始日期的月份控制
            wv_month!!.adapter = NumericWheelAdapter(startMonth, 12)
            wv_month!!.currentItem = month + 1 - startMonth
        } else if (year == endYear) {
            //终止日期的月份控制
            wv_month!!.adapter = NumericWheelAdapter(1, endMonth)
            wv_month!!.currentItem = month
        } else {
            wv_month!!.adapter = NumericWheelAdapter(1, 12)
            wv_month!!.currentItem = month
        }
        wv_month!!.setGravity(gravity)
        // 日
        wv_day = view.findViewById<View>(R.id.day) as WheelView
        val leapYear = year % 4 == 0 && year % 100 != 0 || year % 400 == 0
        if (startYear == endYear && startMonth == endMonth) {
            if (list_big.contains((month + 1).toString())) {
                if (endDay > 31) {
                    endDay = 31
                }
                wv_day!!.adapter = NumericWheelAdapter(startDay, endDay)
            } else if (list_little.contains((month + 1).toString())) {
                if (endDay > 30) {
                    endDay = 30
                }
                wv_day!!.adapter = NumericWheelAdapter(startDay, endDay)
            } else {
                // 闰年
                if (leapYear) {
                    if (endDay > 29) {
                        endDay = 29
                    }
                    wv_day!!.adapter = NumericWheelAdapter(startDay, endDay)
                } else {
                    if (endDay > 28) {
                        endDay = 28
                    }
                    wv_day!!.adapter = NumericWheelAdapter(startDay, endDay)
                }
            }
            wv_day!!.currentItem = day - startDay
        } else if (year == startYear && month + 1 == startMonth) {
            // 起始日期的天数控制
            if (list_big.contains((month + 1).toString())) {
                wv_day!!.adapter = NumericWheelAdapter(startDay, 31)
            } else if (list_little.contains((month + 1).toString())) {
                wv_day!!.adapter = NumericWheelAdapter(startDay, 30)
            } else {
                // 闰年 29,平年 28
                wv_day!!.adapter = NumericWheelAdapter(startDay, if (leapYear) 29 else 28)
            }
            wv_day!!.currentItem = day - startDay
        } else if (year == endYear && month + 1 == endMonth) {
            // 终止日期的天数控制
            if (list_big.contains((month + 1).toString())) {
                if (endDay > 31) {
                    endDay = 31
                }
                wv_day!!.adapter = NumericWheelAdapter(1, endDay)
            } else if (list_little.contains((month + 1).toString())) {
                if (endDay > 30) {
                    endDay = 30
                }
                wv_day!!.adapter = NumericWheelAdapter(1, endDay)
            } else {
                // 闰年
                if (leapYear) {
                    if (endDay > 29) {
                        endDay = 29
                    }
                    wv_day!!.adapter = NumericWheelAdapter(1, endDay)
                } else {
                    if (endDay > 28) {
                        endDay = 28
                    }
                    wv_day!!.adapter = NumericWheelAdapter(1, endDay)
                }
            }
            wv_day!!.currentItem = day - 1
        } else {
            // 判断大小月及是否闰年,用来确定"日"的数据
            if (list_big.contains((month + 1).toString())) {
                wv_day!!.adapter = NumericWheelAdapter(1, 31)
            } else if (list_little.contains((month + 1).toString())) {
                wv_day!!.adapter = NumericWheelAdapter(1, 30)
            } else {
                // 闰年 29,平年 28
                wv_day!!.adapter = NumericWheelAdapter(startDay, if (leapYear) 29 else 28)
            }
            wv_day!!.currentItem = day - 1
        }
        wv_day!!.setGravity(gravity)

        // 添加"年"监听
        wv_year!!.setOnItemSelectedListener { index ->
            val year_num = index + startYear
            currentYear = year_num
            var currentMonthItem = wv_month!!.currentItem //记录上一次的item位置
            // 判断大小月及是否闰年,用来确定"日"的数据
            if (startYear == endYear) {
                //重新设置月份
                wv_month!!.adapter = NumericWheelAdapter(startMonth, endMonth)
                if (currentMonthItem > wv_month!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month!!.adapter.itemsCount - 1
                    wv_month!!.currentItem = currentMonthItem
                }
                val monthNum = currentMonthItem + startMonth
                if (startMonth == endMonth) {
                    //重新设置日
                    setReDay(year_num, monthNum, startDay, endDay, list_big, list_little)
                } else if (monthNum == startMonth) {
                    //重新设置日
                    setReDay(year_num, monthNum, startDay, 31, list_big, list_little)
                } else if (monthNum == endMonth) {
                    setReDay(year_num, monthNum, 1, endDay, list_big, list_little)
                } else { //重新设置日
                    setReDay(year_num, monthNum, 1, 31, list_big, list_little)
                }
            } else if (year_num == startYear) { //等于开始的年
                //重新设置月份
                wv_month!!.adapter = NumericWheelAdapter(startMonth, 12)
                if (currentMonthItem > wv_month!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month!!.adapter.itemsCount - 1
                    wv_month!!.currentItem = currentMonthItem
                }
                val month = currentMonthItem + startMonth
                if (month == startMonth) {
                    //重新设置日
                    setReDay(year_num, month, startDay, 31, list_big, list_little)
                } else {
                    //重新设置日
                    setReDay(year_num, month, 1, 31, list_big, list_little)
                }
            } else if (year_num == endYear) {
                //重新设置月份
                wv_month!!.adapter = NumericWheelAdapter(1, endMonth)
                if (currentMonthItem > wv_month!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month!!.adapter.itemsCount - 1
                    wv_month!!.currentItem = currentMonthItem
                }
                val monthNum = currentMonthItem + 1
                if (monthNum == endMonth) {
                    //重新设置日
                    setReDay(year_num, monthNum, 1, endDay, list_big, list_little)
                } else {
                    //重新设置日
                    setReDay(year_num, monthNum, 1, 31, list_big, list_little)
                }
            } else {
                //重新设置月份
                wv_month!!.adapter = NumericWheelAdapter(1, 12)
                //重新设置日
                setReDay(year_num, wv_month!!.currentItem + 1, 1, 31, list_big, list_little)
            }
            if (mSelectChangeCallback != null) {
                mSelectChangeCallback!!.onTimeSelectChanged()
            }
        }


        // 添加"月"监听
        wv_month!!.setOnItemSelectedListener { index ->
            var month_num = index + 1
            if (startYear == endYear) {
                month_num = month_num + startMonth - 1
                if (startMonth == endMonth) {
                    //重新设置日
                    setReDay(currentYear, month_num, startDay, endDay, list_big, list_little)
                } else if (startMonth == month_num) {

                    //重新设置日
                    setReDay(currentYear, month_num, startDay, 31, list_big, list_little)
                } else if (endMonth == month_num) {
                    setReDay(currentYear, month_num, 1, endDay, list_big, list_little)
                } else {
                    setReDay(currentYear, month_num, 1, 31, list_big, list_little)
                }
            } else if (currentYear == startYear) {
                month_num = month_num + startMonth - 1
                if (month_num == startMonth) {
                    //重新设置日
                    setReDay(currentYear, month_num, startDay, 31, list_big, list_little)
                } else {
                    //重新设置日
                    setReDay(currentYear, month_num, 1, 31, list_big, list_little)
                }
            } else if (currentYear == endYear) {
                if (month_num == endMonth) {
                    //重新设置日
                    setReDay(
                        currentYear,
                        wv_month!!.currentItem + 1,
                        1,
                        endDay,
                        list_big,
                        list_little
                    )
                } else {
                    setReDay(currentYear, wv_month!!.currentItem + 1, 1, 31, list_big, list_little)
                }
            } else {
                //重新设置日
                setReDay(currentYear, month_num, 1, 31, list_big, list_little)
            }
            if (mSelectChangeCallback != null) {
                mSelectChangeCallback!!.onTimeSelectChanged()
            }
        }
        setChangedListener(wv_day)
        require(type.size == 6) { "type[] length is not 6" }
        wv_year!!.visibility = if (type[0]) View.VISIBLE else View.GONE
        wv_month!!.visibility = if (type[1]) View.VISIBLE else View.GONE
        wv_day!!.visibility = if (type[2]) View.VISIBLE else View.GONE
    }

    private fun setSolar2(year: Int, month: Int, day: Int) {
        // 添加大小月月份并将其转换为list,方便之后的判断
        val months_big = arrayOf("1", "3", "5", "7", "8", "10", "12")
        val months_little = arrayOf("4", "6", "9", "11")
        val list_big = Arrays.asList(*months_big)
        val list_little = Arrays.asList(*months_little)
        currentYear = year
        // 年
        wv_year2 = view2.findViewById<View>(R.id.year2) as WheelView
        wv_year2!!.adapter = NumericWheelAdapter(startYear, endYear) // 设置"年"的显示数据
        wv_year2!!.currentItem = year - startYear // 初始化时显示的数据
        wv_year2!!.setGravity(gravity)
        // 月
        wv_month2 = view2.findViewById<View>(R.id.month2) as WheelView
        if (startYear == endYear) { //开始年等于终止年
            wv_month2!!.adapter = NumericWheelAdapter(startMonth, endMonth)
            wv_month2!!.currentItem = month + 1 - startMonth
        } else if (year == startYear) {
            //起始日期的月份控制
            wv_month2!!.adapter = NumericWheelAdapter(startMonth, 12)
            wv_month2!!.currentItem = month + 1 - startMonth
        } else if (year == endYear) {
            //终止日期的月份控制
            wv_month2!!.adapter = NumericWheelAdapter(1, endMonth)
            wv_month2!!.currentItem = month
        } else {
            wv_month2!!.adapter = NumericWheelAdapter(1, 12)
            wv_month2!!.currentItem = month
        }
        wv_month2!!.setGravity(gravity)
        // 日
        wv_day2 = view2.findViewById<View>(R.id.day2) as WheelView
        val leapYear = year % 4 == 0 && year % 100 != 0 || year % 400 == 0
        if (startYear == endYear && startMonth == endMonth) {
            if (list_big.contains((month + 1).toString())) {
                if (endDay > 31) {
                    endDay = 31
                }
                wv_day2!!.adapter = NumericWheelAdapter(startDay, endDay)
            } else if (list_little.contains((month + 1).toString())) {
                if (endDay > 30) {
                    endDay = 30
                }
                wv_day2!!.adapter = NumericWheelAdapter(startDay, endDay)
            } else {
                // 闰年
                if (leapYear) {
                    if (endDay > 29) {
                        endDay = 29
                    }
                    wv_day2!!.adapter = NumericWheelAdapter(startDay, endDay)
                } else {
                    if (endDay > 28) {
                        endDay = 28
                    }
                    wv_day2!!.adapter = NumericWheelAdapter(startDay, endDay)
                }
            }
            wv_day2!!.currentItem = day - startDay
        } else if (year == startYear && month + 1 == startMonth) {
            // 起始日期的天数控制
            if (list_big.contains((month + 1).toString())) {
                wv_day2!!.adapter = NumericWheelAdapter(startDay, 31)
            } else if (list_little.contains((month + 1).toString())) {
                wv_day2!!.adapter = NumericWheelAdapter(startDay, 30)
            } else {
                // 闰年 29,平年 28
                wv_day2!!.adapter = NumericWheelAdapter(startDay, if (leapYear) 29 else 28)
            }
            wv_day2!!.currentItem = day - startDay
        } else if (year == endYear && month + 1 == endMonth) {
            // 终止日期的天数控制
            if (list_big.contains((month + 1).toString())) {
                if (endDay > 31) {
                    endDay = 31
                }
                wv_day2!!.adapter = NumericWheelAdapter(1, endDay)
            } else if (list_little.contains((month + 1).toString())) {
                if (endDay > 30) {
                    endDay = 30
                }
                wv_day2!!.adapter = NumericWheelAdapter(1, endDay)
            } else {
                // 闰年
                if (leapYear) {
                    if (endDay > 29) {
                        endDay = 29
                    }
                    wv_day!!.adapter = NumericWheelAdapter(1, endDay)
                } else {
                    if (endDay > 28) {
                        endDay = 28
                    }
                    wv_day2!!.adapter = NumericWheelAdapter(1, endDay)
                }
            }
            wv_day2!!.currentItem = day - 1
        } else {
            // 判断大小月及是否闰年,用来确定"日"的数据
            if (list_big.contains((month + 1).toString())) {
                wv_day2!!.adapter = NumericWheelAdapter(1, 31)
            } else if (list_little.contains((month + 1).toString())) {
                wv_day2!!.adapter = NumericWheelAdapter(1, 30)
            } else {
                // 闰年 29,平年 28
                wv_day2!!.adapter = NumericWheelAdapter(startDay, if (leapYear) 29 else 28)
            }
            wv_day2!!.currentItem = day - 1
        }
        wv_day2!!.setGravity(gravity)


        // 添加"年"监听
        wv_year2!!.setOnItemSelectedListener { index ->
            val year_num = index + startYear
            currentYear = year_num
            var currentMonthItem = wv_month2!!.currentItem //记录上一次的item位置
            // 判断大小月及是否闰年,用来确定"日"的数据
            if (startYear == endYear) {
                //重新设置月份
                wv_month2!!.adapter = NumericWheelAdapter(startMonth, endMonth)
                if (currentMonthItem > wv_month2!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month2!!.adapter.itemsCount - 1
                    wv_month2!!.currentItem = currentMonthItem
                }
                val monthNum = currentMonthItem + startMonth
                if (startMonth == endMonth) {
                    //重新设置日
                    setReDay(year_num, monthNum, startDay, endDay, list_big, list_little)
                } else if (monthNum == startMonth) {
                    //重新设置日
                    setReDay(year_num, monthNum, startDay, 31, list_big, list_little)
                } else if (monthNum == endMonth) {
                    setReDay(year_num, monthNum, 1, endDay, list_big, list_little)
                } else { //重新设置日
                    setReDay(year_num, monthNum, 1, 31, list_big, list_little)
                }
            } else if (year_num == startYear) { //等于开始的年
                //重新设置月份
                wv_month2!!.adapter = NumericWheelAdapter(startMonth, 12)
                if (currentMonthItem > wv_month2!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month2!!.adapter.itemsCount - 1
                    wv_month2!!.currentItem = currentMonthItem
                }
                val month = currentMonthItem + startMonth
                if (month == startMonth) {
                    //重新设置日
                    setReDay(year_num, month, startDay, 31, list_big, list_little)
                } else {
                    //重新设置日
                    setReDay(year_num, month, 1, 31, list_big, list_little)
                }
            } else if (year_num == endYear) {
                //重新设置月份
                wv_month2!!.adapter = NumericWheelAdapter(1, endMonth)
                if (currentMonthItem > wv_month2!!.adapter.itemsCount - 1) {
                    currentMonthItem = wv_month2!!.adapter.itemsCount - 1
                    wv_month2!!.currentItem = currentMonthItem
                }
                val monthNum = currentMonthItem + 1
                if (monthNum == endMonth) {
                    //重新设置日
                    setReDay(year_num, monthNum, 1, endDay, list_big, list_little)
                } else {
                    //重新设置日
                    setReDay(year_num, monthNum, 1, 31, list_big, list_little)
                }
            } else {
                //重新设置月份
                wv_month2!!.adapter = NumericWheelAdapter(1, 12)
                //重新设置日
                setReDay(year_num, wv_month2!!.currentItem + 1, 1, 31, list_big, list_little)
            }
            if (mSelectChangeCallback != null) {
                mSelectChangeCallback!!.onTimeSelectChanged()
            }
        }


        // 添加"月"监听
        wv_month2!!.setOnItemSelectedListener { index ->
            var month_num = index + 1
            if (startYear == endYear) {
                month_num = month_num + startMonth - 1
                if (startMonth == endMonth) {
                    //重新设置日
                    setReDay(currentYear, month_num, startDay, endDay, list_big, list_little)
                } else if (startMonth == month_num) {

                    //重新设置日
                    setReDay(currentYear, month_num, startDay, 31, list_big, list_little)
                } else if (endMonth == month_num) {
                    setReDay(currentYear, month_num, 1, endDay, list_big, list_little)
                } else {
                    setReDay(currentYear, month_num, 1, 31, list_big, list_little)
                }
            } else if (currentYear == startYear) {
                month_num = month_num + startMonth - 1
                if (month_num == startMonth) {
                    //重新设置日
                    setReDay(currentYear, month_num, startDay, 31, list_big, list_little)
                } else {
                    //重新设置日
                    setReDay(currentYear, month_num, 1, 31, list_big, list_little)
                }
            } else if (currentYear == endYear) {
                if (month_num == endMonth) {
                    //重新设置日
                    setReDay(
                        currentYear,
                        wv_month2!!.currentItem + 1,
                        1,
                        endDay,
                        list_big,
                        list_little
                    )
                } else {
                    setReDay(currentYear, wv_month2!!.currentItem + 1, 1, 31, list_big, list_little)
                }
            } else {
                //重新设置日
                setReDay(currentYear, month_num, 1, 31, list_big, list_little)
            }
            if (mSelectChangeCallback != null) {
                mSelectChangeCallback!!.onTimeSelectChanged()
            }
        }
        setChangedListener(wv_day2)
        require(type.size == 6) { "type[] length is not 6" }
        wv_year2!!.visibility = if (type[0]) View.VISIBLE else View.GONE
        wv_month2!!.visibility = if (type[1]) View.VISIBLE else View.GONE
        wv_day2!!.visibility = if (type[2]) View.VISIBLE else View.GONE
    }

    private fun setChangedListener(wheelView: WheelView?) {
        if (mSelectChangeCallback != null) {
            wheelView!!.setOnItemSelectedListener { mSelectChangeCallback!!.onTimeSelectChanged() }
        }
    }

    private fun setReDay(
        year_num: Int,
        monthNum: Int,
        startD: Int,
        endD: Int,
        list_big: List<String>,
        list_little: List<String>
    ) {
        var endD = endD
        var currentItem = wv_day!!.currentItem

//        int maxItem;
        if (list_big.contains(monthNum.toString())) {
            if (endD > 31) {
                endD = 31
            }
            wv_day!!.adapter = NumericWheelAdapter(startD, endD)
            //            maxItem = endD;
        } else if (list_little.contains(monthNum.toString())) {
            if (endD > 30) {
                endD = 30
            }
            wv_day!!.adapter = NumericWheelAdapter(startD, endD)
            //            maxItem = endD;
        } else {
            if (year_num % 4 == 0 && year_num % 100 != 0
                || year_num % 400 == 0
            ) {
                if (endD > 29) {
                    endD = 29
                }
                wv_day!!.adapter = NumericWheelAdapter(startD, endD)
                //                maxItem = endD;
            } else {
                if (endD > 28) {
                    endD = 28
                }
                wv_day!!.adapter = NumericWheelAdapter(startD, endD)
                //                maxItem = endD;
            }
        }
        if (currentItem > wv_day!!.adapter.itemsCount - 1) {
            currentItem = wv_day!!.adapter.itemsCount - 1
            wv_day!!.currentItem = currentItem
        }
    }

    private fun setContentTextSize() {
        wv_day!!.setTextSize(textSize.toFloat())
        wv_month!!.setTextSize(textSize.toFloat())
        wv_year!!.setTextSize(textSize.toFloat())
        wv_day2!!.setTextSize(textSize.toFloat())
        wv_month2!!.setTextSize(textSize.toFloat())
        wv_year2!!.setTextSize(textSize.toFloat())
    }

    fun setLabels(label_year: String?, label_month: String?, label_day: String?) {
        if (label_year != null) {
            wv_year!!.setLabel(label_year)
            wv_year2!!.setLabel(label_year)
        } else {
            wv_year!!.setLabel("年")
            wv_year2!!.setLabel("年")
        }
        if (label_month != null) {
            wv_month!!.setLabel(label_month)
            wv_month2!!.setLabel(label_month)
        } else {
            wv_month!!.setLabel("月")
            wv_month2!!.setLabel("月")
        }
        if (label_day != null) {
            wv_day!!.setLabel(label_day)
            wv_day2!!.setLabel(label_day)
        } else {
            wv_day!!.setLabel("日")
            wv_day2!!.setLabel("日")
        }
    }

    fun setTextXOffset(x_offset_year: Int, x_offset_month: Int, x_offset_day: Int) {
        wv_year!!.setTextXOffset(x_offset_year)
        wv_month!!.setTextXOffset(x_offset_month)
        wv_day!!.setTextXOffset(x_offset_day)
        wv_year2!!.setTextXOffset(x_offset_year)
        wv_month2!!.setTextXOffset(x_offset_month)
        wv_day2!!.setTextXOffset(x_offset_day)
    }

    /**
     * 设置是否循环滚动
     *
     * @param cyclic
     */
    fun setCyclic(cyclic: Boolean) {
        wv_year!!.setCyclic(cyclic)
        wv_month!!.setCyclic(cyclic)
        wv_day!!.setCyclic(cyclic)
        wv_year2!!.setCyclic(cyclic)
        wv_month2!!.setCyclic(cyclic)
        wv_day2!!.setCyclic(cyclic)
    }

    val time: String
        get() {
            val sb = StringBuilder()
            if (currentYear == startYear) {
                if (wv_month!!.currentItem + startMonth == startMonth) {
                    sb.append(wv_year!!.currentItem + startYear).append("-")
                        .append(wv_month!!.currentItem + startMonth).append("-")
                        .append(wv_day!!.currentItem + startDay)
                } else {
                    sb.append(wv_year!!.currentItem + startYear).append("-")
                        .append(wv_month!!.currentItem + startMonth).append("-")
                        .append(wv_day!!.currentItem + 1)
                }
            } else {
                sb.append(wv_year!!.currentItem + startYear).append("-")
                    .append(wv_month!!.currentItem + 1).append("-")
                    .append(wv_day!!.currentItem + 1)
            }
            return sb.toString()
        }
    val time2: String
        get() {
            val sb = StringBuilder()
            if (currentYear == startYear) {
                if (wv_month2!!.currentItem + startMonth == startMonth) {
                    sb.append(wv_year2!!.currentItem + startYear).append("-")
                        .append(wv_month2!!.currentItem + startMonth).append("-")
                        .append(wv_day2!!.currentItem + startDay)
                } else {
                    sb.append(wv_year2!!.currentItem + startYear).append("-")
                        .append(wv_month2!!.currentItem + startMonth).append("-")
                        .append(wv_day2!!.currentItem + 1)
                }
            } else {
                sb.append(wv_year2!!.currentItem + startYear).append("-")
                    .append(wv_month2!!.currentItem + 1).append("-")
                    .append(wv_day2!!.currentItem + 1)
            }
            return sb.toString()
        }

    /**
     * 设置间距倍数,但是只能在1.0-4.0f之间
     *
     * @param lineSpacingMultiplier
     */
    fun setLineSpacingMultiplier(lineSpacingMultiplier: Float) {
        wv_day!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_month!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_year!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_day2!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_month2!!.setLineSpacingMultiplier(lineSpacingMultiplier)
        wv_year2!!.setLineSpacingMultiplier(lineSpacingMultiplier)
    }

    /**
     * 设置分割线的颜色
     *
     * @param dividerColor
     */
    fun setDividerColor(dividerColor: Int) {
        wv_day!!.setDividerColor(dividerColor)
        wv_month!!.setDividerColor(dividerColor)
        wv_year!!.setDividerColor(dividerColor)
        wv_day2!!.setDividerColor(dividerColor)
        wv_month2!!.setDividerColor(dividerColor)
        wv_year2!!.setDividerColor(dividerColor)
    }

    /**
     * 设置分割线的类型
     *
     * @param dividerType
     */
    fun setDividerType(dividerType: DividerType?) {
        wv_day!!.setDividerType(dividerType)
        wv_month!!.setDividerType(dividerType)
        wv_year!!.setDividerType(dividerType)
        wv_day2!!.setDividerType(dividerType)
        wv_month2!!.setDividerType(dividerType)
        wv_year2!!.setDividerType(dividerType)
    }

    /**
     * 设置分割线之间的文字的颜色
     *
     * @param textColorCenter
     */
    fun setTextColorCenter(textColorCenter: Int) {
        wv_day!!.setTextColorCenter(textColorCenter)
        wv_month!!.setTextColorCenter(textColorCenter)
        wv_year!!.setTextColorCenter(textColorCenter)
        wv_day2!!.setTextColorCenter(textColorCenter)
        wv_month2!!.setTextColorCenter(textColorCenter)
        wv_year2!!.setTextColorCenter(textColorCenter)
    }

    /**
     * 设置分割线以外文字的颜色
     *
     * @param textColorOut
     */
    fun setTextColorOut(textColorOut: Int) {
        wv_day!!.setTextColorOut(textColorOut)
        wv_month!!.setTextColorOut(textColorOut)
        wv_year!!.setTextColorOut(textColorOut)
        wv_day2!!.setTextColorOut(textColorOut)
        wv_month2!!.setTextColorOut(textColorOut)
        wv_year2!!.setTextColorOut(textColorOut)
    }

    /**
     * @param isCenterLabel 是否只显示中间选中项的
     */
    fun isCenterLabel(isCenterLabel: Boolean) {
        wv_day!!.isCenterLabel(isCenterLabel)
        wv_month!!.isCenterLabel(isCenterLabel)
        wv_year!!.isCenterLabel(isCenterLabel)
        wv_day2!!.isCenterLabel(isCenterLabel)
        wv_month2!!.isCenterLabel(isCenterLabel)
        wv_year2!!.isCenterLabel(isCenterLabel)
    }

    fun setSelectChangeCallback(mSelectChangeCallback: ISelectTimeCallback?) {
        this.mSelectChangeCallback = mSelectChangeCallback
    }

    fun setItemsVisible(itemsVisibleCount: Int) {
        wv_day!!.setItemsVisibleCount(itemsVisibleCount)
        wv_month!!.setItemsVisibleCount(itemsVisibleCount)
        wv_year!!.setItemsVisibleCount(itemsVisibleCount)
        wv_day2!!.setItemsVisibleCount(itemsVisibleCount)
        wv_month2!!.setItemsVisibleCount(itemsVisibleCount)
        wv_year2!!.setItemsVisibleCount(itemsVisibleCount)
    }

    fun setAlphaGradient(isAlphaGradient: Boolean) {
        wv_day!!.setAlphaGradient(isAlphaGradient)
        wv_month!!.setAlphaGradient(isAlphaGradient)
        wv_year!!.setAlphaGradient(isAlphaGradient)
        wv_day2!!.setAlphaGradient(isAlphaGradient)
        wv_month2!!.setAlphaGradient(isAlphaGradient)
        wv_year2!!.setAlphaGradient(isAlphaGradient)
    }

    fun setRangDate(startDate: Calendar?, endDate: Calendar?) {
        if (startDate == null && endDate != null) {
            val year = endDate[Calendar.YEAR]
            val month = endDate[Calendar.MONTH] + 1
            val day = endDate[Calendar.DAY_OF_MONTH]
            if (year > startYear) {
                endYear = year
                endMonth = month
                endDay = day
            } else if (year == startYear) {
                if (month > startMonth) {
                    endYear = year
                    endMonth = month
                    endDay = day
                } else if (month == startMonth) {
                    if (day > startDay) {
                        endYear = year
                        endMonth = month
                        endDay = day
                    }
                }
            }
        } else if (startDate != null && endDate == null) {
            val year = startDate[Calendar.YEAR]
            val month = startDate[Calendar.MONTH] + 1
            val day = startDate[Calendar.DAY_OF_MONTH]
            if (year < endYear) {
                startMonth = month
                startDay = day
                startYear = year
            } else if (year == endYear) {
                if (month < endMonth) {
                    startMonth = month
                    startDay = day
                    startYear = year
                } else if (month == endMonth) {
                    if (day < endDay) {
                        startMonth = month
                        startDay = day
                        startYear = year
                    }
                }
            }
        } else if (startDate != null && endDate != null) {
            startYear = startDate[Calendar.YEAR]
            endYear = endDate[Calendar.YEAR]
            startMonth = startDate[Calendar.MONTH] + 1
            endMonth = endDate[Calendar.MONTH] + 1
            startDay = startDate[Calendar.DAY_OF_MONTH]
            endDay = endDate[Calendar.DAY_OF_MONTH]
        }
    }

    companion object {
        var dateFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd")
        private const val DEFAULT_START_YEAR = 1900
        private const val DEFAULT_END_YEAR = 2100
        private const val DEFAULT_START_MONTH = 1
        private const val DEFAULT_END_MONTH = 12
        private const val DEFAULT_START_DAY = 1
        private const val DEFAULT_END_DAY = 31
    }
}

2.改造布局pickerview_time2

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/rv_topbar"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="@color/pickerview_bg_topbar">

        <Button
                android:id="@+id/btnCancel"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:background="@android:color/transparent"
                android:gravity="left|center_vertical"
                android:paddingLeft="@dimen/pickerview_topbar_padding"
                android:text="@string/pickerview_cancel"
                android:textAllCaps="false"
                android:textColor="@drawable/selector_pickerview_btn"
                android:textSize="@dimen/pickerview_topbar_btn_textsize" />

        <TextView
                android:id="@+id/tvTitle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toLeftOf="@+id/btnSubmit"
                android:layout_toRightOf="@+id/btnCancel"
                android:gravity="center"
                android:textColor="@color/pickerview_topbar_title"
                android:textSize="@dimen/pickerview_topbar_title_textsize" />

        <Button
                android:id="@id/btnSubmit"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentRight="true"
                android:background="@android:color/transparent"
                android:gravity="right|center_vertical"
                android:paddingRight="@dimen/pickerview_topbar_padding"
                android:text="@string/pickerview_submit"
                android:textAllCaps="false"
                android:textColor="@drawable/selector_pickerview_btn"
                android:textSize="@dimen/pickerview_topbar_btn_textsize" />
    </RelativeLayout>

    <LinearLayout
            android:padding="8dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white"
            android:orientation="horizontal">
        <LinearLayout
                android:id="@+id/timepicker"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="match_parent"
                android:background="@android:color/white"
                android:gravity="center"
                android:minHeight="180dp"
                android:orientation="horizontal">

            <com.contrarywind.view.WheelView
                    android:id="@+id/year"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1.1" />

            <com.contrarywind.view.WheelView
                    android:id="@+id/month"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />

            <com.contrarywind.view.WheelView
                    android:id="@+id/day"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />

        </LinearLayout>
        <View
                android:background="#cccccc"
                android:layout_width="0.5dp"
                android:layout_height="180dp"
                />
        <LinearLayout
                android:id="@+id/timepicker2"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="match_parent"
                android:background="@android:color/white"
                android:gravity="center"
                android:minHeight="180dp"
                android:orientation="horizontal">

            <com.contrarywind.view.WheelView
                    android:id="@+id/year2"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1.1" />

            <com.contrarywind.view.WheelView
                    android:id="@+id/month2"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />

            <com.contrarywind.view.WheelView
                    android:id="@+id/day2"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />

        </LinearLayout>
    </LinearLayout>



</LinearLayout>

3.使用:调用showPicker()方法即可

    private fun showPicker(){
        val selectedDate = Calendar.getInstance()
        val startDate = Calendar.getInstance()
        val endDate = Calendar.getInstance()
        startDate.set(2013,0,1)
        endDate.set(2099,11,31)
        pvTime = TimePickerBuilder2(this) { date, date2 -> //选中事件回调
            Log.e(TAG,getTime(date)+"到"+getTime(date2))
        }
            .setType(booleanArrayOf(true, true, true, false, false, false)) // 默认全部显示
            .setCancelText("取消") //取消按钮文字
            .setSubmitText("确定") //确认按钮文字
            .setContentTextSize(18) //滚轮文字大小
            .setTitleSize(20) //标题文字大小
            .setTitleText("开始结束时间选择") //标题文字
            .setOutSideCancelable(false) //点击屏幕,点在控件外部范围时,是否取消显示
            .isCyclic(false) //是否循环滚动
            .setDate(selectedDate) // 如果不设置的话,默认是系统时间*/
            .setRangDate(startDate, endDate) //起始终止年月日设定
            .setLabel("年", "月", "日") //默认设置为年月日时分秒
            .isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
            .isDialog(true) //是否显示为对话框样式
            .build()
        pvTime.show()
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容