DatePicker控件在EditText上的使用

首先在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
}
上一篇:日期插件datepicker的使用


下一篇:每日总结