package com.loper7.date_time_picker.dialog
|
|
import android.content.Context
|
import android.graphics.Color
|
import android.os.Bundle
|
import android.util.Log
|
import android.view.View
|
import android.widget.FrameLayout
|
import android.widget.LinearLayout
|
import android.widget.TextView
|
import androidx.annotation.ColorInt
|
import androidx.core.content.ContextCompat
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.loper7.date_time_picker.R
|
import com.loper7.date_time_picker.ext.*
|
import com.loper7.date_time_picker.ext.getMaxWeekOfYear
|
import com.loper7.date_time_picker.ext.getWeekOfYear
|
import com.loper7.date_time_picker.ext.toFormatList
|
import com.loper7.date_time_picker.number_picker.NumberPicker
|
import com.loper7.date_time_picker.utils.StringUtils
|
import com.loper7.tab_expand.ext.dip2px
|
import java.util.*
|
|
|
/**
|
* 卡片 周视图 选择器
|
*/
|
open class CardWeekPickerDialog(context: Context) : BottomSheetDialog(context),
|
View.OnClickListener {
|
companion object {
|
const val CARD = 0 //卡片
|
const val CUBE = 1 //方形
|
const val STACK = 2 //顶部圆角
|
|
fun builder(context: Context): Builder {
|
return lazy { Builder(context) }.value
|
}
|
}
|
|
private var builder: Builder? = null
|
|
private val np_week by lazy { delegate.findViewById<NumberPicker>(R.id.np_week) }
|
private val tv_cancel by lazy { delegate.findViewById<TextView>(R.id.dialog_cancel) }
|
private val tv_submit by lazy { delegate.findViewById<TextView>(R.id.dialog_submit) }
|
private val tv_title by lazy { delegate.findViewById<TextView>(R.id.tv_title) }
|
private val linear_bg by lazy { delegate.findViewById<LinearLayout>(R.id.linear_bg) }
|
private val divider_bottom by lazy { delegate.findViewById<View>(R.id.divider_bottom) }
|
private val divider_line by lazy { delegate.findViewById<View>(R.id.dialog_select_border) }
|
|
private var mBehavior: BottomSheetBehavior<FrameLayout>? = null
|
|
private val calendar by lazy { Calendar.getInstance() }
|
private var weeksData = mutableListOf<MutableList<Long>>()
|
|
|
constructor(context: Context, builder: Builder) : this(context) {
|
this.builder = builder
|
}
|
|
init {
|
builder = builder(context)
|
}
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
setContentView(R.layout.dt_dialog_week_picker)
|
super.onCreate(savedInstanceState)
|
|
val bottomSheet = delegate.findViewById<FrameLayout>(R.id.design_bottom_sheet)
|
bottomSheet!!.setBackgroundColor(Color.TRANSPARENT)
|
|
mBehavior = BottomSheetBehavior.from(bottomSheet)
|
|
weeksData = calendar.getWeeks()
|
builder?.apply {
|
weeksData =
|
calendar.getWeeks(startMillisecond, endMillisecond, startContain, endContain)
|
//背景模式
|
if (model != 0) {
|
val parmas = LinearLayout.LayoutParams(linear_bg!!.layoutParams)
|
when (model) {
|
CARD -> {
|
parmas.setMargins(
|
context.dip2px(12f),
|
context.dip2px(12f),
|
context.dip2px(12f),
|
context.dip2px(12f)
|
)
|
linear_bg!!.layoutParams = parmas
|
linear_bg!!.setBackgroundResource(R.drawable.shape_bg_round_white_5)
|
}
|
CUBE -> {
|
parmas.setMargins(0, 0, 0, 0)
|
linear_bg!!.layoutParams = parmas
|
linear_bg!!.setBackgroundColor(
|
ContextCompat.getColor(
|
context,
|
R.color.colorTextWhite
|
)
|
)
|
}
|
STACK -> {
|
parmas.setMargins(0, 0, 0, 0)
|
linear_bg!!.layoutParams = parmas
|
linear_bg!!.setBackgroundResource(R.drawable.shape_bg_top_round_white_15)
|
}
|
else -> {
|
parmas.setMargins(0, 0, 0, 0)
|
linear_bg!!.layoutParams = parmas
|
linear_bg!!.setBackgroundResource(model)
|
}
|
}
|
}
|
|
//标题
|
if (titleValue.isNullOrEmpty()) {
|
tv_title!!.visibility = View.GONE
|
} else {
|
tv_title?.text = titleValue
|
tv_title?.visibility = View.VISIBLE
|
}
|
|
//按钮
|
tv_cancel?.text = cancelText
|
tv_submit?.text = chooseText
|
|
//主题
|
if (themeColor != 0) {
|
tv_submit!!.setTextColor(themeColor)
|
np_week!!.selectedTextColor = themeColor
|
}
|
|
if (builder!!.assistColor != 0) {
|
tv_title?.setTextColor(builder!!.assistColor)
|
tv_cancel?.setTextColor(builder!!.assistColor)
|
np_week!!.textColor = builder!!.assistColor
|
|
|
}
|
if (builder!!.dividerColor != 0) {
|
divider_bottom?.setBackgroundColor(builder!!.dividerColor)
|
divider_line?.setBackgroundColor(builder!!.dividerColor)
|
np_week!!.dividerColor = builder!!.dividerColor
|
}
|
|
}
|
|
//视图周
|
np_week?.apply {
|
if (weeksData.isNullOrEmpty())
|
return
|
|
minValue = 1
|
maxValue = weeksData.size
|
value = weeksData.index(builder?.defaultMillisecond) + 1
|
isFocusable = true
|
isFocusableInTouchMode = true
|
descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS //设置NumberPicker不可编辑
|
wrapSelectorWheel = builder?.wrapSelectorWheel ?: true
|
|
formatter =
|
builder?.formatter?.invoke(weeksData) ?: NumberPicker.Formatter { value: Int ->
|
var weekData = weeksData[value - 1].toFormatList("yyyy/MM/dd")
|
var str = "${weekData.first()} - ${weekData.last()}"
|
str
|
}
|
}
|
|
tv_cancel!!.setOnClickListener(this)
|
tv_submit!!.setOnClickListener(this)
|
|
}
|
|
override fun onStart() {
|
super.onStart()
|
mBehavior?.state = BottomSheetBehavior.STATE_EXPANDED
|
}
|
|
override fun onClick(v: View) {
|
this.dismiss()
|
when (v.id) {
|
R.id.dialog_submit -> {
|
np_week?.apply {
|
builder?.onChooseListener?.invoke(weeksData[value - 1], formatter.format(value))
|
}
|
}
|
R.id.dialog_cancel -> {
|
builder?.onCancelListener?.invoke()
|
}
|
}
|
this.dismiss()
|
}
|
|
|
class Builder(private var context: Context) {
|
|
@JvmField
|
var cancelText: String = "取消"
|
|
@JvmField
|
var chooseText: String = "确定"
|
|
@JvmField
|
var titleValue: String? = null
|
|
@JvmField
|
var model: Int = CARD
|
|
@JvmField
|
var themeColor: Int = 0
|
|
@JvmField
|
var assistColor: Int = 0
|
|
@JvmField
|
var dividerColor: Int = 0
|
|
@JvmField
|
var wrapSelectorWheel: Boolean = true
|
|
@JvmField
|
var onChooseListener: ((MutableList<Long>, String) -> Unit)? = null
|
|
@JvmField
|
var onCancelListener: (() -> Unit)? = null
|
|
@JvmField
|
var defaultMillisecond: Long = 0
|
|
@JvmField
|
var startMillisecond: Long = 0
|
|
@JvmField
|
var startContain: Boolean = true
|
|
@JvmField
|
var endMillisecond: Long = 0
|
|
@JvmField
|
var endContain: Boolean = true
|
|
@JvmField
|
var formatter: ((MutableList<MutableList<Long>>) -> NumberPicker.Formatter?)? = null
|
|
/**
|
* 设置标题
|
* @param value 标题
|
* @return Builder
|
*/
|
fun setTitle(value: String): Builder {
|
this.titleValue = value
|
return this
|
}
|
|
/**
|
* 显示模式
|
* @param model CARD,CUBE,STACK
|
* @return Builder
|
*/
|
fun setBackGroundModel(model: Int): Builder {
|
this.model = model
|
return this
|
}
|
|
/**
|
* 设置主题颜色
|
* @param themeColor 主题颜色
|
* @return Builder
|
*/
|
fun setThemeColor(@ColorInt themeColor: Int): Builder {
|
this.themeColor = themeColor
|
return this
|
}
|
|
/**
|
*设置是否循环滚动
|
* @return Builder
|
*/
|
fun setWrapSelectorWheel(wrapSelector: Boolean): Builder {
|
this.wrapSelectorWheel = wrapSelector
|
return this
|
}
|
|
/**
|
* 设置默认选中周次所在的任意时间
|
* @param millisecond 默认时间
|
* @return Builder
|
*/
|
fun setDefaultMillisecond(millisecond: Long): Builder {
|
this.defaultMillisecond = millisecond
|
return this
|
}
|
|
/**
|
* 设置起始周所在时间
|
* @param millisecond 起始时间
|
* @param contain 起始周是否包含起始时间
|
* @return Builder
|
*/
|
fun setStartMillisecond(millisecond: Long, contain: Boolean = true): Builder {
|
this.startMillisecond = millisecond
|
this.startContain = contain
|
return this
|
}
|
|
/**
|
* 设置结束周所在时间
|
* @param millisecond 结束时间
|
* @param contain 结束周是否包含结束时间
|
* @return Builder
|
*/
|
fun setEndMillisecond(millisecond: Long, contain: Boolean = true): Builder {
|
this.endMillisecond = millisecond
|
this.endContain = contain
|
return this
|
}
|
|
/**
|
* 设置格式化
|
* @param datas 数据
|
* @return Builder
|
*/
|
fun setFormatter(formatter: (MutableList<MutableList<Long>>) -> NumberPicker.Formatter?): Builder {
|
this.formatter = formatter
|
return this
|
}
|
|
/**
|
* 绑定选择监听
|
* @param text 按钮文字
|
* @param listener 选择监听函数 MutableList<Long> 选择周次所包含的天时间戳 String 周format字符串
|
* @return Builder
|
*/
|
fun setOnChoose(
|
text: String = "确定",
|
listener: ((MutableList<Long>, String) -> Unit)? = null
|
): Builder {
|
this.onChooseListener = listener
|
this.chooseText = text
|
return this
|
}
|
|
/**
|
* 绑定取消监听
|
* @param text 按钮文字
|
* @param listener 取消监听函数
|
* @return Builder
|
*/
|
fun setOnCancel(text: String = "取消", listener: (() -> Unit)? = null): Builder {
|
this.onCancelListener = listener
|
this.cancelText = text
|
return this
|
}
|
|
/**
|
* 这只dialog内辅助文字的颜色
|
* @return Builder
|
*/
|
fun setAssistColor(@ColorInt value: Int): Builder {
|
this.assistColor = value
|
return this
|
}
|
|
/**
|
* 这只dialog内分割线颜色
|
* @return Builder
|
*/
|
fun setDividerColor(@ColorInt value: Int): Builder {
|
this.dividerColor = value
|
return this
|
}
|
|
fun build(): CardWeekPickerDialog {
|
return CardWeekPickerDialog(context, this)
|
}
|
}
|
|
}
|