1. 程式人生 > 其它 >DatePicker控制元件在EditText上的使用

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
}