Android 监听键盘输入(实现搜索、发送、完成等等)

简介: 在Android App的实际开发中,时常会需要监听软键盘的输入事件。所以个人在此进行一个总结。例如:微信和QQ聊天的消息发送,你会发现他的聊天框并没有发送的控件,软键盘的换行或者某个按钮会变成发送;在某些浏览器的输入框,输入内容后,软件盘的某个按钮会有搜索的字样,还有填写内容时的完成按钮等等,这些都可以通过监听键盘和输入框的一些配置实现这些功能。

在Android App的实际开发中,时常会需要监听软键盘的输入事件。


所以个人在此进行一个总结。


例如:微信和QQ聊天的消息发送,你会发现他的聊天框并没有发送的控件,软键盘的换行或者某个按钮会变成发送;在某些浏览器的输入框,输入内容后,软件盘的某个按钮会有搜索的字样,还有填写内容时的完成按钮等等,这些都可以通过监听键盘和输入框的一些配置实现这些功能。


方法一:dispatchEvent

使用dispatchEvent方法进行键盘的监听,例如我在输入某个用户ID后,点击Enter键盘直接进行搜索。


override fun dispatchKeyEvent(event: KeyEvent?): Boolean { 
        //&& event.getAction() != KeyEvent.ACTION_UP这个条件是因为dispatchKeyEvent被调用了俩次,导致重复请求,所以把up这个动作去掉
        if (event?.keyCode == KeyEvent.KEYCODE_ENTER && event.action != KeyEvent.ACTION_UP) {
            val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (inputMethodManager.isActive) {
        //收起当前界面的键盘
                inputMethodManager.hideSoftInputFromWindow(this.currentFocus?.windowToken, 0)
            }
            searchUser()//调用接口,搜索用户
            return true
        }
        return super.dispatchKeyEvent(event)
    }

方法二:KeyListener

通过给控件设置KeyListener来监听软键盘,实现的逻辑一样,只是接口不同而已。


editText.setOnKeyListener { view, keyCode, keyEvent ->
            if (keyCode == KeyEvent.KEYCODE_ENTER && keyCode != KeyEvent.ACTION_UP) {
                val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                if (inputMethodManager.isActive) {
                    inputMethodManager.hideSoftInputFromWindow(this.currentFocus?.windowToken, 0)
                }
                searchUser()
                return@setOnKeyListener true
            } else return@setOnKeyListener false
        }

方法三:setOnEditorActionListener

第三个方法完美的实现了最近项目的需求,即是使用setOnEditorActionListener来监听键盘并且改变键盘右下角的按钮内容,我的右下角本来是换行,可以通过setOnEditorActionListener和xml文件里editText的android:imeOptions配置实现比较完美的功能。


首先是kotlin代码:


inputEdit.setOnEditorActionListener { _, actionId, _ ->
                    return@setOnEditorActionListener when (actionId) {
                 //EditorInfo里还有很多其他的action可以监听
                        EditorInfo.IME_ACTION_SEND -> {
                            //发送对象id
                            val id = requireActivity().intent.getLongExtra("userId", 0)
                            if (id != 0L) {
                                if (!inputEdit.text.isNullOrBlank()) {
                                    IMHelper.Sender.sendText(id, inputEdit.text.toString())//发送聊天消息
                                    inputEdit.setText("")//发送后输入框清空
                                }
                            }
                            true
                        }
                        else -> false
                    }
                }

然后是xml代码:

<androidx.appcompat.widget.AppCompatEditText
                    android:id="@+id/chat_input_edit"
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:layout_marginStart="@dimen/margin_10"
                    android:layout_marginTop="@dimen/margin_10"
                    android:layout_marginEnd="@dimen/margin_10"
                    android:layout_marginBottom="@dimen/margin_10"
                    android:background="@drawable/rgb2e3036_r8"
                    android:hint="@string/im_chat_input_hint"
                    android:paddingHorizontal="12dp"
                    android:layout_toStartOf="@id/chat_input_send"
                    android:paddingVertical="10dp"
                    android:singleLine="true"
                    android:imeOptions="actionSend"//看这行就够了
                    android:textColor="@color/white"
                    android:textColorHint="#94ffffff"
                    android:textSize="14sp" />


其中的android:imeOptions="actionSend",就代表右下角的按钮的文本将会显示为发送,而上面的kotlin代码则会监听这个发送按钮的点击事件,然后执行代码。当然,除此之外,右下角的按钮还有很多其他的功能,在敲代码时就可以看到:




几个常用的键盘右下角的键设置


actionUnspecified 未指定,对应常量EditorInfo.IME_ACTION_UNSPECIFIED效果:

actionNone 没有动作,对应常量EditorInfo.IME_ACTION_NONE效果:回车键,常用连续几个输入框的输入,点击后光标到下一行

actionGo 去往,对应常量EditorInfo.IME_ACTION_GO 效果:

actionSearch 搜索,对应常量EditorInfo.IME_ACTION_SEARCH效果:

actionSend 发送,对应常量EditorInfo.IME_ACTION_SEND效果:

actionNext 下一个,对应常量EditorInfo.IME_ACTION_NEXT效果:

actionDone 完成,对应常量EditorInfo.IME_ACTION_DONE效果:

属性详解


android:imeOptions=”flagNoExtractUi” //使软键盘不全屏显示,只占用一部分屏幕,同时,

这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键

android:imeOptions=”actionNone” //输入框右侧不带任何提示
android:imeOptions=”actionGo” //右下角按键内容为’开始’
android:imeOptions=”actionSearch” //右下角按键为放大镜图片,搜索
android:imeOptions=”actionSend” //右下角按键内容为’发送’
android:imeOptions=”actionNext” //右下角按键内容为’下一步’ 或者下一项
android:imeOptions=”actionDone” //右下角按键内容为’完成’

注意:如果设置了键盘没有变化,那么需要单独加一些其他的属性配合使用,一般添加android:inputType="text"就行了


一、xml中属性设置


1 将singleLine设置为true(基本上设置这个就成功了,maxlines=“1”不管用哦!)


2 将inputType设置为text


二、java代码设置

editText.setInputType(EditorInfo.TYPE_CLASS_TEXT);
editText.setImeOptions(EditorInfo.IME_ACTION_SEARCH)


键盘的监听大致就是这三种方法,仅作为个人总结,有错误的地方望批评指正!


相关文章
|
生物认证 开发工具 Android开发
安卓设备签到,还是用视觉智能平台人脸搜索1:N
安卓设备签到,还是用视觉智能平台人脸搜索1:N
177 2
|
7月前
|
XML 监控 Android开发
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
305 0
|
5月前
|
监控 Android开发 开发者
Android经典面试题之实战经验分享:如何简单实现App的前后台监听判断
本文介绍在Android中判断应用前后台状态的两种方法:`ActivityLifecycleCallbacks`和`ProcessLifecycleOwner`。前者提供精细控制,适用于需针对每个Activity处理的场景;后者简化前后台检测,适用于多数应用。两者各有优劣:`ActivityLifecycleCallbacks`更精确但复杂度高;`ProcessLifecycleOwner`更简便但可能在极端场景下略有差异。根据应用需求选择合适方法。
43 2
|
5月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
6月前
|
Android开发
技术经验分享:Android前后台切换的监听
技术经验分享:Android前后台切换的监听
100 2
|
6月前
|
XML Android开发 数据格式
37. 【Android教程】基于监听的事件处理机制
37. 【Android教程】基于监听的事件处理机制
85 2
|
7月前
|
Android开发
Android监听USB设备插拔
Android监听USB设备插拔
894 7
|
7月前
|
Android开发
Android监听蓝牙广播
Android监听蓝牙广播
64 1
|
7月前
|
Android开发
Android 对鼠标事件的监听实现
Android 对鼠标事件的监听实现
171 1
|
小程序 JavaScript 前端开发
微信小程序(十七)小程序监听返回键跳转事件(安卓返回也适用)
onUnload:function(){ wx.redirectTo({ url: '../index/index' }) wx.navigateTo({ url: '../index/index' }) wx.switchTab({ url: '../../member/member' }) }
1050 0