现在很多已经用起了Kotlin语言写安卓项目,
项目里面有一个需求,选择日期范围,刷新选择的时间区间所检索的数据,
在某大牛原控件的基础上,做了一个拓展使用,可解决一些原控件的bug问题。
文内只写了日期的选择使用,时间的选择类似,
控件api可以去控件原地址参详:https://github.com/borax12/MaterialDateRangePicker
Demo里有各个方法的详细的操作注释。
Demo地址:https://download.csdn.net/download/w630886916/10605044
class MainActivity : AppCompatActivity(), DatePickerDialog.OnDateSetListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
//显示时间选择器弹窗
showDatePickerDialog()
}
}
//显示 日期选择器
private fun showDatePickerDialog() {
val now = Calendar.getInstance()
val dpd = DatePickerDialog.newInstance(
this@MainActivity,
now.get(Calendar.YEAR),
now.get(Calendar.MONTH),
now.get(Calendar.DAY_OF_MONTH)
)
dpd.show(fragmentManager, "Datepickerdialog")
}
/**
* @param yearn年(始)例:2018
* @param monthOfYear月(始)例:8
* @param dayOfMonth日(始)例:15
* @param yearEnd(结束)例:2018
* @param monthOfYearEnd(结束)例:8
* @param dayOfMonthEnd(结束)例:16
* 由于发现 此控件有个bug,显示的月份少1月,故在取数据的时候,加1.
*/
override fun onDateSet(view: DatePickerDialog?, year: Int, monthOfYear: Int, dayOfMonth: Int, yearEnd: Int, monthOfYearEnd: Int, dayOfMonthEnd: Int) {
//开始时间的时间戳
val timeStart = DateUtils.getTimeStart("" + year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日")
//结束时间的时间戳
val timeEnd = DateUtils.getTimeEnd("" + yearEnd + "年" + (monthOfYearEnd + 1) + "月" + dayOfMonthEnd + "日")
Log.d("&&&&&&&&&&&", "【" + year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日" + "】——到——【" +
yearEnd + "年" + (monthOfYearEnd + 1) + "月" + dayOfMonthEnd + "日】")
Log.d("&&&&&&&&&&&", "【开始时间戳:" + timeStart + "】——到——【" + "结束时间戳:" + timeEnd + "】")
//如果需要一些判断操作,可以try-catch 一下 或 if-else 判断
try {
if (timeStart?.toLong()!! > timeEnd?.toLong()!!) {
Toast.makeText(this, "结束时间不能小于开始时间", Toast.LENGTH_SHORT).show()
return
}
} catch (e: Exception) {
Toast.makeText(this, "选择时间的有误", Toast.LENGTH_SHORT).show()
}
}
}
object DateUtils {
/**
* 字符串转时间戳
* 开始时间
* @param timeString 年月日的String
* @return 转化年月日为时间戳String(适配PHP 除以1000)-后台是java的话则不用除以1000
*/
fun getTimeStart(timeString: String): String? {
var timeStamp: String? = null
val sdf = SimpleDateFormat("yyyy年MM月dd日")
val d: Date
try {
d = sdf.parse(timeString)
var l = d.time
if (l.toString().length > 10) {
l = l / 1000
}
timeStamp = l.toString()
} catch (e: ParseException) {
e.printStackTrace()
}
return timeStamp
}
/**
* 字符串转时间戳
* 结束时间- 追加23小时59分钟
* @param timeString 年月日的String
* @return 转化年月日为时间戳String(适配PHP 除以1000)-后台是java的话则不用除以1000
*/
fun getTimeEnd(timeString: String): String? {
var timeStamp: String? = null
val sdf = SimpleDateFormat("yyyy年MM月dd日HH:mm")
val d: Date
try {
d = sdf.parse((timeString + "23:59"))
var l = d . time
if (l.toString().length > 10) {
l = l / 1000
}
timeStamp = l.toString()
} catch (e: ParseException) {
e.printStackTrace()
}
return timeStamp
}
}
build.gradle里面直接导入:
compile 'com.borax12.materialdaterangepicker:library:1.9'
我们知道,build.gradle导入的控件,很多情况是不方便直接修改的。但是我们这里查看源码的时候,发现大牛写的很好,很多地方是引用 资源values里面的,这也就方便了我们修改和部分自定义:
我们直接在自己的资源values里面,对照的控件里的资源名称,重新写一份自定义的设置就行,系统是会“覆盖引用”的。
找到资源包的位置,和资源文件,查看对应的引用参数,自己定义即可。
这里有个Android Studio 工具的使用小技巧:按住Ctrl键+鼠标点方法名,自动打开控件代码页,左边列表里有个◎(如图),点击一下,会自动定位到资源位置。然后自己查看源码对照引用参数,自定义即可。
我这里举例:修改了FROM和TO 变成开始时间 和 结束时间。
好了,欢迎大家一起学习指正。
Demo地址:https://download.csdn.net/download/w630886916/10605044