android 如何显示软键盘中的搜索以及处理点击搜索却进行了两次操作问题

android 如何显示软键盘中的搜索以及处理点击搜索却进行了两次操作问题

最近在项目中遇到的一个需求是,需要调出android手机中的软件盘,并在软件盘上显示出“搜索”按钮,然后通过这个“搜索”按钮进行强搜操作(做一个网络请求)。其实这个实现起来比较easy的:1、需要在edittext的xml文件中设置 android:imeOptions=”actionSearch”属性;2、在逻辑代码中实现以下代码就OK了,

searchWordEt.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_ENTER) {
                        //在这里做你需要的操作
                       //对于我来说我需要在这里做网络请求
                        return true;
                    }
                }
                return false;
            }
        });

但是在项目提测时候,qa在测试发现我这这个网络请求时,每次都请求这个接口两次,不得不说qa是真的厉害,所以这就成了我写出来的一个bug。

然后我检查了一下我网络请求这块是木有问题的,所以想到可能是在软键盘点击搜索这块的问题,网上随便搜了一下,发现很多热心的博主都给出了超级统一的解决方案:


        searchWordEt.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                    //在这里做请求操作
                    return true;
                }
                return false;
            }
        });

也就是对edittext从setOnKeyListener变为setOnEditorActionListener,这样就可以完美解决了。本来这里就可以over了,但是我好想问一下为什么,貌似大家都木有说为什么setOnKeyListener这个监听就会在实际中执行两次接口请求呢。OK,可以看到在onKey回调方法中,除了有keyCode参数,还有keyEvent参数,然后经过一些测试发现,之所以在setOnKeyListener时会进行两次想要的操作,问题就出在keyEvent这里。这样考虑,我们在点击软键盘中的“搜索”按钮这个过程中,我们的action实际上也是有两个的,即action down和action up。
假如说在action down 和 action up都去响应了这个方法的话,做两次网络接口请求就可以解释通了,抱着试试看的态度,我把出bug的代码改成了如下:

searchWordEt.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_ENTER && 
                event.getAction() == KeyEvent.ACTION_UP) {
                        //在这里做你需要的操作
                       //对于我来说我需要在这里做网络请求
                        return true;
                    }
                }
                return false;
            }
        });

可以看到我在相应条件中添加了event.getAction() == KeyEvent.ACTION_UP这句,也就是说我在action up时候才去做网络请求,然后测试一下,OK木有问题,这样就只做一次请求了。

但是,在遇到使用软键盘上搜索按钮进行操作时,建议对相应的edittext使用setOnEditorActionListener,我在这里只是想讨论一下为什么setOnKeyListener会出现问题,以及对应的解决方案。

ps:第一篇blog,求轻拍,老司机请绕行~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值