首先在xml布局中创建一个EditText,并设置id。注意inputMethod和editable属性已经弃用,转为inputType。正常情况下点击EditText会弹出软键盘输入内容。在需要添加如日期选择,时间选择等的控件的时候,通常将inputType置为none,即可阻止软键盘弹出。这里采用不报warning的设置方式,将输入类型设置为日期date,在触发事件中重置输入类型。
<EditText
android:id="@+id/startProjectDate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:inputType="date"/>
OnClickListener失效的问题
布局设置好了,就要讨论一下EditText打开日期选择器DatePicker的触发方式。如果EditText只作为显示,不需要编辑文本,但需要点击该布局可以执行其他事件,就会冲突,导致OnClickListener失效。所以采用OnTouchListener监听触摸事件。
startProjectDate.setOnTouchListener { _, event ->
// 业务逻辑
false
}
但是在OnTouchListener的使用中,又出现了焦点问题。也就是在view能获得焦点的情况下,第一次触摸屏幕默认获取焦点,造成用户多次点击才能成功完成功能。为了解决这一问题,对事件的类型做了分类处理,并且在UP时执行performClick设置焦点。
when (event?.action) {
MotionEvent.ACTION_DOWN -> {
// 显示控件逻辑
}
MotionEvent.ACTION_UP -> {
startProjectDate.performClick()
}
MotionEvent.ACTION_MOVE -> {
}
}
DatePicker的对话框
首先初始化一个日期实例,获取当前时间。创建一个DatePickerDialog,在当前页面弹出显示当前时间,在用户选择后,将EditText上显示日期,便于存储至数据库。
val s = Calendar.getInstance()
val year = s.get(Calendar.YEAR)
val month = s.get(Calendar.MONTH)
val day = s.get(Calendar.DAY_OF_MONTH)
val dpd = DatePickerDialog(
this@ProjectProgressActivity,
{ _, mYear, mMonth, dayOfMonth ->
val date = StringBuffer().append(mYear).append("-")
.append(mMonth + 1).append("-").append(dayOfMonth)
startProjectDate.setText(date)
}, year, month, day)
dpd.show()
完整源代码
startProjectDate.setOnTouchListener { _, event ->
startProjectDate.inputType = InputType.TYPE_NULL
when (event?.action) {
MotionEvent.ACTION_DOWN -> {
val s = Calendar.getInstance()
val year = s.get(Calendar.YEAR)
val month = s.get(Calendar.MONTH)
val day = s.get(Calendar.DAY_OF_MONTH)
val dpd = DatePickerDialog(
this@ProjectProgressActivity,
{ _, mYear, mMonth, dayOfMonth ->
val date = StringBuffer().append(mYear).append("-")
.append(mMonth + 1).append("-").append(dayOfMonth)
startProjectDate.setText(date)
}, year, month, day)
dpd.show()
}
MotionEvent.ACTION_UP -> {
startProjectDate.performClick()
}
MotionEvent.ACTION_MOVE -> {
}
}
false
}