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"

猜你喜欢

转载自blog.csdn.net/qq_34198206/article/details/82983145