赞
踩
一、EditText调用软键盘搜索 setOnKeyListener 事件为什么执行了两次?
- etProjectName.setOnKeyListener(new View.OnKeyListener() {
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_ENTER) {
- // 先隐藏键盘
- ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE))
- .hideSoftInputFromWindow(PublishProjectActivity.this.getCurrentFocus()
- .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
- //进行搜索操作的方法,在该方法中可以加入mEditSearchUser的非空判断
- **search(); //执行两次,想一想为什么?**
- return true;
- }
- return false;
- }
- });
二、解决方案:
方案1
- mBinding.etSearch.setOnKeyListener((v, keyCode, event) -> { // 开始搜索
- if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) { //避免setOnKeyListener 执行两次
- // 先隐藏键盘
- ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE))
- .hideSoftInputFromWindow(SearchActivity.this.getCurrentFocus()
- .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
- //搜索逻辑
- search(mBinding.etSearch.getText().toString());
- return true;
- }
- return false;
- });
方案2
- et.setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
- //判断是否是“放大镜”键【简称搜索键】
- if(actionId == EditorInfo.IME_ACTION_SEARCH){
- //隐藏软键盘
- //对应逻辑操作
- return true;
- }
- return false;
- }
- });
总结:setOnEditorActionListener这个方法,并不是在我们点击EditText的时候触发,也不是在我们对EditText进行编辑时触发,而是在我们编辑完之后点击软键盘上的各种键才会触发
三、知识拓展
1、修改Editview属性:Android:imeOptions=“actionSearch” 在该Editview获得焦点的时候将“回车”键改为“搜索”
- android:singleLine="true" 不然回车【搜索】会换行
- 可以随自己的需求更改软键盘右下角的显示样式,例如:搜索,下一步,Q(搜索图标)
-
- actionNone : 按下后光标到下一行(回车)
- actionGo : 按下后搜索(Go)
- actionSearch : 放大镜【搜索】
- actionSend : Send 按下后发送
- actionNext : Next 下一步
- actionDone : Done,确定/完成,隐藏软键盘(包括不是最后一个文本输入框的情况也会隐藏)
- 使用方法:在xml里面写布局时直接加给EditTxt的imeOptions属性,例如:
-
- 项目开发中涉及到按键事件处理:
-
- **“dispatchKeyEvent” “onKeyDown ”“onKeyLisenter” 简单理解**
- 接受按键优先级:
-
- **dispatchKeyEvent > Activity的onKeyDown > view的onKeyLisenter**
- 其中按键处理事件return true ;表示已消耗此事件,不再继续传递;
2、Android MotionEvent的getX()和getRawX()方法的区别
3、Android中的View:getLeft()、getTop()、getRight()、getBottom()
此博文主要参阅:https://blog.csdn.net/m0_37700275/article/details/76944153,想了解更多类似的知识点,可以点击此链接!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。