1. 程式人生 > >android仿微信、QQ等聊天介面,實現點選輸入框彈出軟鍵盤、點選其他區域收起軟鍵盤,預設滑動至最低端

android仿微信、QQ等聊天介面,實現點選輸入框彈出軟鍵盤、點選其他區域收起軟鍵盤,預設滑動至最低端

如圖所示,點選輸入框及選擇圖片和傳送按鈕時軟鍵盤顯示且不消失,點選其他區域,則隱藏軟鍵盤。

主要程式碼如下:

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
    if (ev!!.getAction() === MotionEvent.ACTION_DOWN) {
        val v = currentFocus
        if (isShouldHideInput(v, ev!!)) {//點選的是其他區域,則呼叫系統方法隱藏軟鍵盤
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (imm != null) {
                imm!!.hideSoftInputFromWindow(v!!.windowToken, 0)
            }
        }
        return super.dispatchTouchEvent(ev)
    }
    // 必不可少,否則所有的元件都不會有TouchEvent了
    return if (window.superDispatchTouchEvent(ev)) {
        true
    } else onTouchEvent(ev)
}

/**
 * 判斷是否是輸入框區域
 */
fun isShouldHideInput(v: View?, event: MotionEvent): Boolean {
    if (v != null) {
        when (v.id) {
            R.id.etEditContent -> {
                val leftTop = intArrayOf(0, 0)
                //獲取輸入框當前的location位置
                v!!.getLocationInWindow(leftTop)
                val left = leftTop[0]
                val top = leftTop[1]
                val bottom = top + v!!.getHeight()
                val right = DisplayUtil.getScreenWidth(this)
                return if (event.x > left && event.x < right
                        && event.y > top && event.y < bottom) {
                    // 點選的是輸入框區域,保留點選EditText的事件
                    false
                } else {
                    true
                }
            }
            else -> {
                return false
            }
        }
    }
    return false
}
 

 在第一次進入該頁面、彈出軟鍵盤、收到訊息的時候,將RecycleView滑至最後一條: 

rvSingleChat.scrollToPosition(adapter!!.itemCount - 1)

 記得在當前Activity的配置檔案裡面需要設定為:

android:windowSoftInputMode="adjustResize"