在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)
键盘的监听大致就是这三种方法,仅作为个人总结,有错误的地方望批评指正!