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
186 2
|
9月前
|
XML 监控 Android开发
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
405 0
|
7月前
|
监控 Android开发 开发者
Android经典面试题之实战经验分享:如何简单实现App的前后台监听判断
本文介绍在Android中判断应用前后台状态的两种方法:`ActivityLifecycleCallbacks`和`ProcessLifecycleOwner`。前者提供精细控制,适用于需针对每个Activity处理的场景;后者简化前后台检测,适用于多数应用。两者各有优劣:`ActivityLifecycleCallbacks`更精确但复杂度高;`ProcessLifecycleOwner`更简便但可能在极端场景下略有差异。根据应用需求选择合适方法。
63 2
|
7月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
8月前
|
Android开发
技术经验分享:Android前后台切换的监听
技术经验分享:Android前后台切换的监听
154 2
|
8月前
|
XML Android开发 数据格式
37. 【Android教程】基于监听的事件处理机制
37. 【Android教程】基于监听的事件处理机制
113 2
|
9月前
|
Android开发
Android监听USB设备插拔
Android监听USB设备插拔
973 7
|
小程序 JavaScript 前端开发
微信小程序(十七)小程序监听返回键跳转事件(安卓返回也适用)
onUnload:function(){ wx.redirectTo({ url: '../index/index' }) wx.navigateTo({ url: '../index/index' }) wx.switchTab({ url: '../../member/member' }) }
1161 0
|
9月前
|
Android开发
Android监听蓝牙广播
Android监听蓝牙广播
82 1
|
9月前
|
Android开发
Android 对鼠标事件的监听实现
Android 对鼠标事件的监听实现
224 1

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    Android历史版本与APK文件结构
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    14
  • 2
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    28
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    35
  • 4
    Android历史版本与APK文件结构
    122
  • 5
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    30
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    24
  • 7
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    60
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 9
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    73
  • 10
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    121