美文网首页AndroidUI
android 自定义出生日期选择

android 自定义出生日期选择

作者: 客观开发者 | 来源:发表于2021-04-20 14:33 被阅读0次
效果图片 GIF 2021-4-20 14-21-16.gif

只有dialog 显示,然后在 日历 中日期的计算。
使用了一个wheelview 第三方的view ,就一个java 文件就搞定了,其它的代码都是自己写的。
这样三个java 文件就搞定了,减少了第三方的使用。

使用。

           var dialog = SelectBirthdayDialog(this)
            dialog.setData(birthdays, monthDatas, dayDatas)
            dialog.onSelectBirthdayLinsener = object : SelectBirthdayDialog.OnSelectBirthdayLinsener {
                override fun selectBirthdayLinsener(
                        birthdayData: SelectBirthdayDialog.BirthDayBean?,
                        monthData: SelectBirthdayDialog.BirthDayBean?,
                        dayData: SelectBirthdayDialog.BirthDayBean?) {
                    birthdays = birthdayData
                    monthDatas = monthData
                    dayDatas = dayData
                    tvBirthday.text = "" + birthdayData?.value + "-" + monthData?.value + "-" + dayData?.value
                    dialog.dismiss()
                }
            }
            dialog.show()

传入上次选择的。如果上次没有就显示 进入的日期。 日期选择是一年的任意日期。

想要修改,直接修改结束时间就可以了..

其它内容

SelectBirthdayDialog.kt
style.xml
dialog_select_region.xml
WheelView.java
IWheelEntity.java
其它没有了。。。。
java 文件是第三方的 。
style.xml

<style name="dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:backgroundDimAmount">0.6</item>
    </style>

layout.xml

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv_cancel"
            android:layout_width="@dimen/dp_44"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:focusable="true"
            android:gravity="center"
            android:text="取消"
            android:textColor="@color/txt_color_3"
            android:textSize="13sp" />

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="选择地区"
            android:textColor="#ff333333"
            android:textSize="13sp" />

        <TextView
            android:id="@+id/tv_confirm"
            android:layout_width="@dimen/dp_44"
            android:layout_height="@dimen/dp_44"
            android:gravity="center"
            android:text="确定"
            android:textColor="@color/colorPrimary"
            android:textSize="13sp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="@color/white"
        android:orientation="horizontal">
    年
        <com.xxx.base.view.WheelView
            android:id="@+id/wheelview1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1" />
月
        <com.xxx.base.view.WheelView
            android:id="@+id/wheelview2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1" />
日
        <com.xxx.base.view.WheelView
            android:id="@+id/wheelview3"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1" />

    </LinearLayout>
</LinearLayout>

然后就是源码了


class SelectBirthdayDialog : Dialog {

    constructor(context: Context) : this(context, R.style.dialog)

    constructor(context: Context, themeResId: Int) : super(context, themeResId) {
        setContentView(R.layout.dialog_select_region)
        window?.setGravity(Gravity.BOTTOM)
        window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
    }

    var onSelectBirthdayLinsener: OnSelectBirthdayLinsener? = null

    var yearList: ArrayList<BirthDayBean> = ArrayList()
    var monthList: List<BirthDayBean> = ArrayList()
    var dayList: List<BirthDayBean> = ArrayList()

    var yearData: BirthDayBean? = null
    var monthData: BirthDayBean? = null
    var dayData: BirthDayBean? = null

    var year: String? = ""
    var month: String? = ""
    var day: String? = ""

    private var wheelview1: WheelView<BirthDayBean>? = null
    private var wheelview2: WheelView<BirthDayBean>? = null
    private var wheelview3: WheelView<BirthDayBean>? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        var tv_title = findViewById<TextView>(R.id.tv_title)
        tv_title.text = "选择出生日期"

        wheelview1 = findViewById(R.id.wheelview1)
        wheelview2 = findViewById(R.id.wheelview2)
        wheelview3 = findViewById(R.id.wheelview3)

        tv_cancel.setOnClickListener { dismiss() }
        tv_confirm.setOnClickListener {
            if (onSelectBirthdayLinsener != null) {
                onSelectBirthdayLinsener?.selectBirthdayLinsener(yearData, monthData, dayData)
            }
        }
        /*先 初始化 数据*/
        getListData()
        /*在初始化 数据 绑定控件*/
        initData()
        /*在初始化 数据 控件的变化*/
        wheelview1?.onWheelChangedListener = object : WheelView.OnWheelChangedListener {
            override fun onWheelScroll(scrollOffsetY: Int) {
            }

            override fun onWheelSelected(position: Int) {
            }

            override fun onWheelScrollStateChanged(state: Int) {
            }

            override fun onWheelItemChanged(oldPosition: Int, newPosition: Int) {
                yearData = yearList?.get(newPosition)
                year = yearData?.value
                monthList = yearData?.children!!
                monthData = monthList?.get(0)
                month = monthData?.value
                initWheelView(wheelview2, monthList, 2)
                dayList = monthList!![0].children
                dayData = dayList?.get(0)
                day = dayData?.value
                initWheelView(wheelview3, dayList, 3)
            }
        }

        wheelview2?.onWheelChangedListener = object : WheelView.OnWheelChangedListener {
            override fun onWheelScroll(scrollOffsetY: Int) {
            }

            override fun onWheelSelected(position: Int) {
            }

            override fun onWheelScrollStateChanged(state: Int) {
            }

            override fun onWheelItemChanged(oldPosition: Int, newPosition: Int) {
                monthData = monthList?.get(newPosition)
                dayList = monthData?.children!!
                dayData = dayList?.get(0)
                day = "01"
                initWheelView(wheelview3, dayList, 3)
            }
        }

        wheelview3?.onWheelChangedListener = object : WheelView.OnWheelChangedListener {
            override fun onWheelScroll(scrollOffsetY: Int) {
            }

            override fun onWheelSelected(position: Int) {
            }

            override fun onWheelScrollStateChanged(state: Int) {
            }

            override fun onWheelItemChanged(oldPosition: Int, newPosition: Int) {
                dayData = dayList?.get(newPosition)
            }
        }

    }

    private fun initWheelView(wheelview: WheelView<BirthDayBean>?, list: List<BirthDayBean>?, type: Int) {
        wheelview?.data = list
        wheelview?.isShowDivider = true
        wheelview?.setDividerColorRes(R.color.me_line)
        wheelview?.dividerHeight = 1f

        wheelview?.selectedItemPosition = 0

        //尽请使用各种方法
        wheelview?.setTextSize(16f, true)
        wheelview?.setSelectedItemTextColorRes(R.color.txt_color_3)
        wheelview?.setNormalItemTextColorRes(R.color.txt_color_6)

        when (type) {
            1 -> {
                if (!TextUtils.isEmpty(year)) {
                    for ((index, bean: BirthDayBean) in list!!.withIndex()) {
                        if (bean.value == year) {
                            wheelview?.selectedItemPosition = index
                        }
                    }
                }
            }
            2 -> {
                if (!TextUtils.isEmpty(month)) {
                    for ((index, bean: BirthDayBean) in list!!.withIndex()) {
                        if (bean.value == month) {
                            wheelview?.selectedItemPosition = index
                        }
                    }
                }
            }
            3 -> {
                if (!TextUtils.isEmpty(day)) {
                    for ((index, bean: BirthDayBean) in list!!.withIndex()) {
                        if (bean.value == day) {
                            wheelview?.selectedItemPosition = index
                        }
                    }
                }
            }
        }

    }

    /*初始化 控件*/
    private fun initData() {
        year = if (yearData == null) {
            "" + dBegin?.year
        } else {
            yearData?.value
        }
        month = if (monthData == null) {
            fillZero(dBegin?.month!!)
        } else {
            monthData?.value
        }
        day = if (dayData == null) {
            fillZero(dBegin?.day!!)
        } else {
            dayData?.value
        }
        initWheelView(wheelview1, yearList, 1)

        for (bean: BirthDayBean in yearList) {
            if (bean.value == year) {
                yearData = bean
                monthList = yearData?.children!!
                initWheelView(wheelview2, monthList, 2)
                break
            }
        }
        for (bean: BirthDayBean in monthList) {
            if (bean.value == month) {
                monthData = bean
                dayList = monthData?.children!!
                initWheelView(wheelview3, dayList, 3)
                break
            }
        }
        for (bean: BirthDayBean in dayList) {
            if (bean.value == day) {
                dayData = bean
                break
            }
        }

    }


    data class BirthDayBean(
            var label: String,
            var value: String,
            var children: List<BirthDayBean>
    ) : IWheelEntity {
        override fun getWheelText(): String {
            return label
        }
    }

    data class DateToday(
            var year: Int,
            var month: Int,
            var day: Int
    )

    interface OnSelectBirthdayLinsener {
        fun selectBirthdayLinsener(birthday: BirthDayBean?, monthData: BirthDayBean?, dayData: BirthDayBean?)
    }

    /*获取今天 的日期*/
    fun getDate1(): DateToday {
        val cal: Calendar = Calendar.getInstance()
        val year: Int = cal.get(Calendar.YEAR)
        // 获取月
        val month: Int = cal.get(Calendar.MONTH) + 1
        // 获取日
        val day: Int = cal.get(Calendar.DAY_OF_MONTH)
        return DateToday(year, month, day)
    }

    /*获取一年前的日期*/
    fun getDate2(): DateToday {
        val cal = Calendar.getInstance()
        cal.add(Calendar.YEAR, -1)
        cal.add(Calendar.DAY_OF_MONTH, +1)
        val year = cal[Calendar.YEAR]
        // 获取月
        val month = cal[Calendar.MONTH] + 1
        // 获取日
        val day = cal[Calendar.DAY_OF_MONTH]

        return DateToday(year, month, day)
    }

    var dBegin: DateToday? = null

    fun getListData() {
        dBegin = getDate1()
        var dEnd = getDate2()
//        println("" + dBegin?.year + "-" + dBegin?.month + "-" + dBegin?.day)
//        println("" + dEnd.year + "-" + dEnd.month + "-" + dEnd.day)

        var startYear = dBegin!!.year
        var endYear = dEnd.year

        var startMonth = dBegin!!.month
        var endMonth = dEnd.month

        var startDay = dBegin!!.day
        var endDay = dEnd.day

        yearList.clear()

        if (startYear == endYear) {
            var selectedYear = startYear;
            var bean = BirthDayBean("" + startYear + "年", "" + startYear, ArrayList())
            bean.children = getMouthList(selectedYear, startYear, endYear, startMonth, endMonth, startDay, endDay)
            yearList.add(bean)
        } else if (startYear < endYear) {
            //年份正序
            for (i in startYear..endYear) {
                var bean = BirthDayBean("" + i + "年", "" + i, ArrayList())
                bean.children = getMouthList(i, startYear, endYear, startMonth, endMonth, startDay, endDay)
                yearList.add(bean)
            }
        } else {
            //年份逆序
            for (i in endYear..startYear) {
                var bean = BirthDayBean("" + i + "年", "" + i, ArrayList())
                bean.children = getMouthList(i, endYear, startYear, startMonth, endMonth, startDay, endDay)
                yearList.add(bean)
            }
        }
    }

    private fun getMouthList(
            selectedYear: Int,
            startYear: Int, endYear: Int,
            startMonth: Int, endMonth: Int,
            startDay: Int, endDay: Int
    ): List<BirthDayBean> {
        var list = ArrayList<BirthDayBean>()
        if (startYear == endYear) {
            if (startMonth > endMonth) {
                for (i in endMonth..startMonth) {
                    var monthBean = BirthDayBean(fillZero(i) + "月", fillZero(i), ArrayList())
                    monthBean.children = getDayList(selectedYear, i, startYear, endYear, endMonth, startMonth, startDay, endDay)
                    list.add(monthBean)
                }
            } else {
                for (i in startMonth..endMonth) {
                    var monthBean = BirthDayBean(fillZero(i) + "月", fillZero(i), ArrayList())
                    monthBean.children = getDayList(selectedYear, i, startYear, endYear, startMonth, endMonth, startDay, endDay)
                    list.add(monthBean)
                }
            }
        } else if (selectedYear == startYear) {
            for (i in startMonth..12) {
                var monthBean = BirthDayBean(fillZero(i) + "月", fillZero(i), ArrayList())
                monthBean.children = getDayList(selectedYear, i, startYear, endYear, startMonth, 12, startDay, endDay)
                list.add(monthBean)
            }
        } else if (selectedYear == endYear) {
            for (i in 1..endMonth) {
                var monthBean = BirthDayBean(fillZero(i) + "月", fillZero(i), ArrayList())
                monthBean.children = getDayList(selectedYear, i, startYear, endYear, 1, endMonth, startDay, endDay)
                list.add(monthBean)
            }
        } else {
            for (i in 1..12) {
                var monthBean = BirthDayBean(fillZero(i) + "月", fillZero(i), ArrayList())
                monthBean.children = getDayList(selectedYear, i, startYear, endYear, 1, 12, startDay, endDay)
                list.add(monthBean)
            }
        }
        return list
    }

    fun getDayList(
            selectedYear: Int, selectedMonth: Int,
            startYear: Int, endYear: Int,
            startMonth: Int, endMonth: Int,
            startDay: Int, endDay: Int
    ): List<BirthDayBean> {
        var list = ArrayList<BirthDayBean>()
        var maxDays = calculateDaysInMonth(selectedYear, selectedMonth);

        if (selectedYear == startYear && selectedMonth == startMonth) {
            //开始年月相同情况
            for (i in endDay..maxDays) {
                var dayBean = BirthDayBean(fillZero(i) + "日", fillZero(i), ArrayList())
                list.add(dayBean)
            }

        } else if (selectedYear == endYear && selectedMonth == endMonth) {
            //结束年月相同情况
            for (i in 1..startDay) {
                var dayBean = BirthDayBean(fillZero(i) + "日", fillZero(i), ArrayList())
                list.add(dayBean)
            }
        } else {
            for (i in 1..maxDays) {
                var dayBean = BirthDayBean(fillZero(i) + "日", fillZero(i), ArrayList())
                list.add(dayBean)
            }
        }
        return list
    }

    fun fillZero(number: Int): String {
        return if (number < 10) "0$number" else "" + number
    }

    /**
     * 根据年份及月份计算每月的天数
     */
    fun calculateDaysInMonth(year: Int, month: Int): Int {
        // 添加大小月月份并将其转换为list,方便之后的判断
        var bigList: List<String> = listOf("1", "3", "5", "7", "8", "10", "12");
        var littleList: List<String> = listOf("4", "6", "9", "11")
        // 判断大小月及是否闰年,用来确定"日"的数据
        if (bigList.contains("" + month)) {
            return 31;
        } else if (littleList.contains("" + month)) {
            return 30;
        } else {
            if (year <= 0) {
                return 29;
            }
            // 是否闰年
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                return 29;
            } else {
                return 28;
            }
        }
    }

    fun setData(birthdays: BirthDayBean?, monthDatas: BirthDayBean?, dayDatas: BirthDayBean?) {
        this.yearData = birthdays
        this.monthData = monthDatas
        this.dayData = dayDatas
    }

}

代码copy 完毕。

相关文章

网友评论

    本文标题:android 自定义出生日期选择

    本文链接:https://www.haomeiwen.com/subject/jqyelltx.html