ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DatePicker控件在EditText上的使用

2021-07-17 12:03:27  阅读:254  来源: 互联网

标签:DatePicker 控件 val get EditText Calendar append startProjectDate


首先在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,控件,val,get,EditText,Calendar,append,startProjectDate
来源: https://www.cnblogs.com/canblogs/p/15022853.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有