DatePicker控制元件在EditText上的使用
阿新 • • 發佈:2021-07-17
首先在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
}