![](https://img.haomeiwen.com/i1309984/694173f078c826e3.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 完毕。
网友评论