我是靠谱客的博主 含蓄芹菜,这篇文章主要介绍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,求轻拍,老司机请绕行~

最后

以上就是含蓄芹菜最近收集整理的关于android 如何显示软键盘中的搜索以及处理点击搜索却进行了两次操作问题的全部内容,更多相关android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部